摘要:比如運行結(jié)果那如果我們在遍歷的時候需要使用到元素的索引呢類似方法那樣很可惜,的并沒有提供一個帶索引的方法。的輸入?yún)?shù)第一個即索引,第二個為元素。我們測試下這個方法運行結(jié)果結(jié)果和預(yù)期的一致。
在 上一篇文章 中,我們討論了如何使用 Java8 中 Map 添加的新方法 computeIfAbsent 來統(tǒng)計集合中每個元素出現(xiàn)的所有位置,代碼如下:
public static Map> getElementPositions(List list) { Map > positionsMap = new HashMap<>(); for (int i = 0; i < list.size(); i++) { positionsMap.computeIfAbsent(list.get(i), k -> new ArrayList<>(1)).add(i); } return positionsMap; }
至少有兩點需要探討:
1、如果 list 不是基于數(shù)組的(即不是 RandomAccess 的),而是基于鏈表的,那么 list.get(int index) 方法的效率就值得思考了;
2、既然都有了 Lambda(即當(dāng)前平臺為 Java8),我們?yōu)槭裁催€要一次次去寫傳統(tǒng)的 for 循環(huán)呢?
在 Java8 中,為 Iterable 接口添加了默認(rèn)的 forEach 方法:
很好理解,遍歷當(dāng)前 Iterable 中所有的元素,使用每個元素作為參數(shù)調(diào)用一次 action。而 Collection 接口繼承了 Iterable 接口,所以所有的繼承自 Collection 的集合類都可以直接調(diào)用 forEach 方法。比如:
public static void main(String[] args) throws Exception { Listlist = Arrays.asList("a", "b", "b", "c", "c", "c", "d", "d", "d", "f", "f", "g"); list.forEach(str -> System.out.print(str + " ")); System.out.println(); }
運行結(jié)果:
那如果我們在遍歷的時候需要使用到元素的索引呢(類似 getElementPositions 方法那樣)?
很可惜,Java8 的 Iterable 并沒有提供一個帶索引的 forEach 方法。不過自己動手,豐衣足食 —— 讓我們自己寫一個帶索引的 forEach 方法:
import java.util.Objects; import java.util.function.BiConsumer; /** * Iterable 的工具類 */ public class Iterables { public staticvoid forEach( Iterable extends E> elements, BiConsumer action) { Objects.requireNonNull(elements); Objects.requireNonNull(action); int index = 0; for (E element : elements) { action.accept(index++, element); } } }
該 forEach 方法第一個參數(shù)為要遍歷的 Iterable,第二個參數(shù)為 BiConsumer。BiConsumer 的輸入?yún)?shù)第一個即索引,第二個為元素。
我們測試下這個 forEach 方法:
public static void main(String[] args) throws Exception { Listlist = Arrays.asList("a", "b", "b", "c", "c", "c", "d", "d", "d", "f", "f", "g"); Iterables.forEach(list, (index, str) -> System.out.println(index + " -> " + str)); }
運行結(jié)果:
結(jié)果和預(yù)期的一致。
現(xiàn)在我們使用 Iterables.forEach 改寫 getElementPositions 方法:
public static Map> getElementPositions(List list) { Map > positionsMap = new HashMap<>(); Iterables.forEach(list, (index, str) -> { positionsMap.computeIfAbsent(str, k -> new ArrayList<>(1)).add(index); }); return positionsMap; } public static void main(String[] args) throws Exception { List list = Arrays.asList("a", "b", "b", "c", "c", "c", "d", "d", "d", "f", "f", "g"); System.out.println("使用 computeIfAbsent 和 Iterable.forEach:"); Map > elementPositions = getElementPositions(list); System.out.println(elementPositions); }
運行結(jié)果和原來一致:
真的不明白這么簡單且實用的方法,Java8 為什么不在 Iterable 中提供一個默認(rèn)實現(xiàn)(此處應(yīng)有黑人問號)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/66372.html
摘要:大家好,我是樂字節(jié)的小樂。需要注意的是很多流操作本身就會返回一個流,所以多個操作可以直接連接起來,如下圖這樣,操作可以進(jìn)行鏈?zhǔn)秸{(diào)用,并且并行流還可以實現(xiàn)數(shù)據(jù)流并行處理操作。為集合創(chuàng)建并行流。 大家好,我是樂字節(jié)的小樂。說起流,我們會聯(lián)想到手機(jī)、電腦組裝流水線,物流倉庫商品包裝流水線等等,如果把手機(jī) ,電腦,包裹看做最終結(jié)果的話,那么加工商品前的各種零部件就可以看做數(shù)據(jù)源,而中間一系列的...
摘要:需要注意的是很多流操作本身就會返回一個流,所以多個操作可以直接連接起來,如下圖這樣,操作可以進(jìn)行鏈?zhǔn)秸{(diào)用,并且并行流還可以實現(xiàn)數(shù)據(jù)流并行處理操作。為集合創(chuàng)建并行流。 上一篇文章,小樂給大家介紹了《Java8新特性之方法引用》,下面接下來小樂將會給大家介紹Java8新特性之Stream,稱之為流,本篇文章為上半部分。 1、什么是流? Java Se中對于流的操作有輸入輸出IO流,而Jav...
摘要:靜態(tài)初始化簡化的語法格式動態(tài)初始化動態(tài)初始化只指定數(shù)組的長度,由系統(tǒng)為每個數(shù)組元素指定初始值。也就是說,數(shù)組引用變量是訪問堆內(nèi)存中數(shù)組元素的根本方式。 順序結(jié)構(gòu) 程序從上到下逐行地執(zhí)行,中間沒有任何判斷和跳轉(zhuǎn)。 分支結(jié)構(gòu) if條件語句 if語句使用布爾表達(dá)式或布爾值作為分支條件來進(jìn)行分支控制。 第一種形式: if(logic expression) { ...
摘要:很多語言等從設(shè)計之初就支持表達(dá)式。注意此時外部局部變量將自動變?yōu)樽鳛榉椒ǚ祷刂道臃祷嘏袛嘧址欠駷榭张袛嘧址欠駷榭战裉礻P(guān)于新特性表達(dá)式就講到這里了,接下來我會繼續(xù)講述新特性之函數(shù)式接口。 上一篇文章我們了解了Java8新特性-接口默認(rèn)方法,接下來我們聊一聊Java8新特性之Lambda表達(dá)式。 Lambda表達(dá)式(也稱為閉包),它允許我們將函數(shù)當(dāng)成參數(shù)傳遞給某個方法,或者把代碼...
摘要:數(shù)據(jù)流教程原文譯者飛龍協(xié)議這個示例驅(qū)動的教程是數(shù)據(jù)流的深入總結(jié)。但是的數(shù)據(jù)流是完全不同的東西。數(shù)據(jù)流是單體,并且在函數(shù)式編程中起到重要作用。列表上的所有流式操作請見數(shù)據(jù)流的。基本的數(shù)據(jù)流使用特殊的表達(dá)式,例如,而不是,而不是。 Java 8 數(shù)據(jù)流教程 原文:Java 8 Stream Tutorial 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 這個示例驅(qū)動的教程是J...
閱讀 2336·2021-11-23 09:51
閱讀 1137·2021-11-22 13:52
閱讀 3611·2021-11-10 11:35
閱讀 1187·2021-10-25 09:47
閱讀 2994·2021-09-07 09:58
閱讀 1059·2019-08-30 15:54
閱讀 2817·2019-08-29 14:21
閱讀 3025·2019-08-29 12:20