詳解Java8的forEach(...)如何提供index值
Java2遍歷集合
遍歷Collection的代碼,可以是采用Iterator接口,通過(guò)next()遍歷。如:
List<String> list = Arrays.asList("Hi", "I", "am", "Henry.Yao");
// 此處已經(jīng)用到了泛型,不能算是純粹的Java2代碼,僅作Iterator示范
for (Iterator<String> it = list.iterator(); it.hasNext();) {
String item = it.next();
System.out.println("listItem = " + item);
}
輸出:
listItem = Hi
listItem = I
listItem = am
listItem = Henry.Yao
Java5遍歷集合
在Java5中,提供了增強(qiáng)的for循環(huán),如:
List<String> list = Arrays.asList("Hi", "I", "am", "Henry.Yao");
for(String item : list) {
System.out.println("listItem = " + item);
}
Java8遍歷集合
在Java8中,通過(guò)Lambda表達(dá)式提供了更簡(jiǎn)潔的編程方式,如:
list.forEach(item -> {
System.out.println("listItem = " + item);
});
需同時(shí)提供index,咋辦?
操作集合元素item的同時(shí),如果還需要同時(shí)提供index值,咋辦?
思考后,我們可能大都寫出了如下的代碼,同時(shí)心有不甘:
List<String> list = Arrays.asList("Hi", "I", "am", "Henry.Yao");
for(int index; index<list.size(); index++) {
String item = list.get(i);
System.out.println("list["+index+"] = "+item);
}
輸出:
list[0] = Hi,
list[1] = I
list[2] = am
list[3] = Henry.Yao
期望的遍歷模式
因?yàn)椋缦碌哪J讲攀俏覀兤谕哪J?/p>
list.forEach((item, index) -> {
System.out.println("listItem = " + item);
}); // Compile ERROR
這只是期望。實(shí)際上,Jdk8并沒(méi)有提供該函數(shù),直至Jdk11也均沒(méi)有提供該函數(shù)。
通過(guò)BiConsumer包裝Consumer實(shí)現(xiàn)
“沒(méi)有工具,我們制造工具” 定義如下的工具方法,基于這個(gè)工具方法,我們就能在遍歷集合,同時(shí)提供item和index值:
// 工具方法
public static <T> Consumer<T> consumerWithIndex(BiConsumer<T, Integer> consumer) {
class Obj {
int i;
}
Obj obj = new Obj();
return t -> {
int index = obj.i++;
consumer.accept(t, index);
};
}
這樣的業(yè)務(wù)代碼,是我期望的!
基于該工具方法,便可輕松編寫如下業(yè)務(wù)代碼,清晰、簡(jiǎn)潔:
list.forEach(LambdaUtils.consumerWithIndex((item, index) -> {
System.out.println("list[" + index + "]=" + item);
}));
思考過(guò)程
這個(gè)工具方法的設(shè)計(jì)過(guò)程,也是參考借鑒了distinctByKey,如圖:
// 工具方法
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Map<Object, Boolean> seen = new ConcurrentHashMap<>();
return t -> Objects.isNull(seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE));
}
// 業(yè)務(wù)代碼 // 從人員列表中過(guò)濾出一個(gè)子集(每個(gè)部門選一個(gè)人) employees.stream().filter(distinctByKey(Employee::getDeptCode)).collect(toList());
我們不僅要會(huì)使用工具,更要會(huì)制造工具…
我們的程序,不僅僅只是大片的業(yè)務(wù)代碼,更是需要抽象和提取出的諸多工具方法。
使用工具(使用Java和第三方提供的方法)到極致,那是高級(jí)程序員,
制造工具(分析和設(shè)計(jì)出項(xiàng)目的工具方法)到極致,那是高級(jí)設(shè)計(jì)師。
到此這篇關(guān)于詳解Java8的forEach(...)如何提供index值的文章就介紹到這了,更多相關(guān)Java8 forEach提供index值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Cloud中FeignClient實(shí)現(xiàn)文件上傳功能
這篇文章主要為大家詳細(xì)介紹了Spring Cloud中FeignClient實(shí)現(xiàn)文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
spring中JdbcTemplate操作oracle的存儲(chǔ)過(guò)程實(shí)例代碼
JdbcTemplate是Spring對(duì)JDBC的封裝,目的是使JDBC更加易于使用,JdbcTemplate是Spring的一部分,下面這篇文章主要給大家介紹了關(guān)于spring中JdbcTemplate操作oracle的存儲(chǔ)過(guò)程的相關(guān)資料,需要的朋友可以參考下2023-04-04
Java控制臺(tái)版五子棋的簡(jiǎn)單實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Java控制臺(tái)版五子棋的簡(jiǎn)單實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
spring?boot如何通過(guò)自定義注解和AOP攔截指定的請(qǐng)求
這篇文章主要介紹了spring?boot通過(guò)自定義注解和AOP攔截指定的請(qǐng)求,本文主要通過(guò)切面類和自定注解的方式,攔截指定的接口(代碼中已經(jīng)作了詳細(xì)的說(shuō)明),需要的朋友可以參考下2024-06-06
springboot?+mybatis?使用PageHelper實(shí)現(xiàn)分頁(yè)并帶條件模糊查詢功能
這篇文章主要介紹了springboot?+mybatis?使用PageHelper實(shí)現(xiàn)分頁(yè)并帶條件模糊查詢功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02
springboot整合kaptcha生成驗(yàn)證碼功能
這篇文章主要介紹了springboot整合kaptcha生成驗(yàn)證碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
Java String.replace()方法"無(wú)效"的原因及解決方式
這篇文章主要介紹了Java String.replace()方法"無(wú)效"的原因及解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
IDEA調(diào)試功能使用總結(jié)(step?over/step?into/force?step?into/step?o
本文主要介紹了IDEA調(diào)試功能使用總結(jié)(step?over/step?into/force?step?into/step?out),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07

