91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用Java中的foreach語句來獲取對象index下標

發布時間:2022-02-23 15:17:53 來源:億速云 閱讀:400 作者:小新 欄目:開發技術

這篇文章主要介紹了怎么使用Java中的foreach語句來獲取對象index下標,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

前言

在Java8中,我們經常使用lambada表達式進行foreach循環,但是常常我們在遍歷List的時候想獲取對象的index,但是Java8、9、10、11都沒有相關的支持,同樣的問題也存在于增強型for循環中,很多時候不得不含著淚以 for (int i = 0; i < list.size(); i++) 的方式寫代碼

我們的期望

list.foreach((item,index)->{})  //編譯不通過

常見的list獲取index方法

for(int i=0;i<list.size();i++>)

for (int i = 0; i < list.size(); i++) {   
}

indexOf(Obj)

for (Object o : list) {
    list.indexOf(o); //如果是Set還沒有這個方法
}

還有…

int i = 0;
for (String s : list) {
    i++;
}

很顯然上述的方法并不是我們所想要的

Consumer和BiConsumer

我們看個簡單的例子

Consumer<String> consumer = t -> System.out.println(t);
consumer.accept("single");
BiConsumer<String, String> biConsumer = (k, v) -> System.out.println(k+":"+v);
biConsumer.accept("multipart","double params");

輸出結果:

single
multipart:double params

這里不難發現我們平時寫的箭頭函數其實是一個Consumer或者BiConsumer對象

定制Consumer

foreach源碼

default void forEach(Consumer<? super T> action) {
    Objects.requireNonNull(action);
    for (T t : this) {
        action.accept(t);
    }
}

分析源碼可知,我們的list foreach方法傳入的是Consumer對象,支持一個參數,而我們想要的是item,index兩個參數,很明顯不滿足,這時我們可以自定義一個Consumer,傳參是BiConsumer,這樣就能滿足我們需求了,代碼如下:

import java.util.ArrayList;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

public class LambadaTools {
    /**
     * 利用BiConsumer實現foreach循環支持index
     *
     * @param biConsumer
     * @param <T>
     * @return
     */
    public static <T> Consumer<T> forEachWithIndex(BiConsumer<T, Integer> biConsumer) {
        /*這里說明一下,我們每次傳入forEach都是一個重新實例化的Consumer對象,在lambada表達式中我們無法對int進行++操作,
        我們模擬AtomicInteger對象,寫個getAndIncrement方法,不能直接使用AtomicInteger哦*/
        class IncrementInt{
            int i = 0;
            public int getAndIncrement(){
                return i++;
            }
        }
        IncrementInt incrementInt = new IncrementInt();
        return t -> biConsumer.accept(t, incrementInt.getAndIncrement());
    }
}

調用示例:

List<String> list = new ArrayList();
list.add("111");
list.add("222");
list.add("333");
list.forEach(LambadaTools.forEachWithIndex((item, index) -> {
    System.out.println(index +":"+ item);
}));

輸出結果如下:

0:111
1:222
2:333

PS:這個Set也可以用哦,不過在Set使用中這個index可不是下標

感謝你能夠認真閱讀完這篇文章,希望小編分享的“怎么使用Java中的foreach語句來獲取對象index下標”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

祁阳县| 龙陵县| 娄烦县| 秭归县| 余江县| 泽库县| 德安县| 湟中县| 克什克腾旗| 会同县| 恩平市| 壤塘县| 景宁| 高清| 卓资县| 凌海市| 根河市| 奈曼旗| 仲巴县| 得荣县| 威海市| 庐江县| 涞源县| 水城县| 石门县| 阿拉善右旗| 五家渠市| 保康县| 临西县| 西安市| 资溪县| 那曲县| 葫芦岛市| 永靖县| 杭锦后旗| 浠水县| 达尔| 沙河市| 白山市| 连江县| 龙山县|