您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關怎么在Java8中使用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<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對象
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
上述就是小編為大家分享的怎么在Java8中使用foreach循環獲取對象的index下標了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。