Java8中用foreach循環(huán)獲取對(duì)象的index下標(biāo)詳解
前言
在Java8中,我們經(jīng)常使用lambada表達(dá)式進(jìn)行foreach循環(huán),但是常常我們?cè)诒闅vList的時(shí)候想獲取對(duì)象的index,但是Java8、9、10、11都沒有相關(guān)的支持,同樣的問題也存在于增強(qiáng)型for循環(huán)中,很多時(shí)候不得不含著淚以 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還沒有這個(gè)方法 }
還有…
int i = 0; for (String s : list) { i++; }
很顯然上述的方法并不是我們所想要的
Consumer和BiConsumer
我們看個(gè)簡單的例子
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");
輸出結(jié)果:
single
multipart:double params
這里不難發(fā)現(xiàn)我們平時(shí)寫的箭頭函數(shù)其實(shí)是一個(gè)Consumer或者BiConsumer對(duì)象
定制Consumer
foreach源碼
default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }
分析源碼可知,我們的list foreach方法傳入的是Consumer對(duì)象,支持一個(gè)參數(shù),而我們想要的是item,index兩個(gè)參數(shù),很明顯不滿足,這時(shí)我們可以自定義一個(gè)Consumer,傳參是BiConsumer,這樣就能滿足我們需求了,代碼如下:
import java.util.ArrayList; import java.util.List; import java.util.function.BiConsumer; import java.util.function.Consumer; public class LambadaTools { /** * 利用BiConsumer實(shí)現(xiàn)foreach循環(huán)支持index * * @param biConsumer * @param <T> * @return */ public static <T> Consumer<T> forEachWithIndex(BiConsumer<T, Integer> biConsumer) { /*這里說明一下,我們每次傳入forEach都是一個(gè)重新實(shí)例化的Consumer對(duì)象,在lambada表達(dá)式中我們無法對(duì)int進(jìn)行++操作, 我們模擬AtomicInteger對(duì)象,寫個(gè)getAndIncrement方法,不能直接使用AtomicInteger哦*/ class IncrementInt{ int i = 0; public int getAndIncrement(){ return i++; } } IncrementInt incrementInt = new IncrementInt(); return t -> biConsumer.accept(t, incrementInt.getAndIncrement()); } }
調(diào)用示例:
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); }));
輸出結(jié)果如下:
0:111
1:222
2:333
PS:這個(gè)Set也可以用哦,不過在Set使用中這個(gè)index可不是下標(biāo)
總結(jié)
到此這篇關(guān)于Java8中用foreach循環(huán)獲取對(duì)象的index下標(biāo)的文章就介紹到這了,更多相關(guān)Java8獲取對(duì)象index下標(biāo)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot登錄、退出、獲取用戶信息的session處理方案
這篇文章主要介紹了SpringBoot登錄、退出、獲取用戶信息的session處理,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08java學(xué)習(xí)之JVM運(yùn)行時(shí)常量池理解
這篇文章主要介紹了java學(xué)習(xí)之JVM運(yùn)行時(shí)常量池理解,對(duì)常量池的好處以及基本類型的包裝類常量池等作了簡要分析,有需要的朋友可以借鑒參考下2021-09-09Java 高并發(fā)七:并發(fā)設(shè)計(jì)模型詳解
本文主要介紹Java高并發(fā) 并發(fā)設(shè)計(jì)模型的知識(shí),這里主要講解 1. 什么是設(shè)計(jì)模式 2. 單例模式 3. 不變模式 4. Future模式 5. 生產(chǎn)者消費(fèi)者,有需要的小伙伴可以參考下2016-09-09@PreAuthorize、@PostAuthorize、@PreFilter、@PostFilter注解的用法詳解
這篇文章主要介紹了@PreAuthorize、@PostAuthorize、@PreFilter、@PostFilter注解的用法詳解,通過在方法上添加@PreAuthorize注解,可以指定需要滿足的權(quán)限條件,只有滿足條件的用戶才能執(zhí)行該方法,需要的朋友可以參考下2023-10-10Springboot使用異步請(qǐng)求提高系統(tǒng)的吞吐量詳解
這篇文章主要介紹了Springboot使用異步請(qǐng)求提高系統(tǒng)的吞吐量詳解,和同步請(qǐng)求相對(duì),異步不需要等待響應(yīng),隨時(shí)可以發(fā)送下一次請(qǐng)求,如果是同步請(qǐng)求,需要將信息填寫完整,再發(fā)送請(qǐng)求,服務(wù)器響應(yīng)填寫是否正確,再做修改,需要的朋友可以參考下2023-08-08java留言管理系統(tǒng)中模糊查詢實(shí)例分享
這篇文章主要為大家詳細(xì)介紹了基于MVC+DAO的留言管理系統(tǒng)中java模糊查詢的簡單使用方法,感興趣的小伙伴們可以參考一下2016-04-04