Stream 接口
所在包:import java.util.stream.Stream;
A sequence of elements supporting sequential and parallel aggregate operations.
- Stream 是元素的集合,類似Iterator
- 支持順序和并行的聚合操作
Iterator VS Stream
- Iterator浆劲,用戶只能一個(gè)一個(gè)的遍歷元素并對(duì)其執(zhí)行某些操作
- Stream,用戶只要給出需要對(duì)其包含的元素執(zhí)行什么操作础拨,比如“過(guò)濾掉長(zhǎng)度大于10的字符串”掠抬、“獲取每個(gè)字符串的首字母”等吼野,具體這些操作如何應(yīng)用到每個(gè)元素上,都由 Stream 完成
使用Stream的基本步驟
- 創(chuàng)建 Stream
- 通過(guò) Stream 接口的靜態(tài)工廠方法 (注意:Java8里接口可以帶靜態(tài)方法)
- 通過(guò) Collection 接口的默認(rèn)方法 stream()两波,把一個(gè) Collection 對(duì)象轉(zhuǎn)換成Stream (較常用)
- 轉(zhuǎn)換 Stream瞳步,每次轉(zhuǎn)換原有Stream對(duì)象不改變,返回一個(gè)新的Stream對(duì)象
- 對(duì) Stream 進(jìn)行聚合(Reduce)操作
Stream 的轉(zhuǎn)換
-
distinct
對(duì) Stream 中包含的元素進(jìn)行去重操作
List<Integer> list = Arrays.asList(1, null, 1, 2, null, 5, 3, 9, 7);
list.stream().distinct().forEach((s) -> {System.out.print(s + " ");});
-
filter(Predicate<? super T> predicate)
對(duì) Stream 中包含的元素使用給定的過(guò)濾函數(shù)進(jìn)行過(guò)濾操作
List<Integer> list = Arrays.asList(1, null, 1, 2, null, 5, 3, 9, 7);
list.stream().filter((s) -> s != null).forEach((s) -> {System.out.print(s + " ");});
-
map(Function<? super T, ? extends R> mapper)
對(duì) Stream 中包含的元素使用給定的轉(zhuǎn)換函數(shù)進(jìn)行轉(zhuǎn)換操作
List<Integer> list = Arrays.asList(1, null, 1, 2, null, 5, 3, 9, 7);
list.stream().filter((s) -> s != null).map((s) -> s + 1).forEach((s) -> {
System.out.print(s + " ");
});
-
limit(long maxSize)
對(duì)一個(gè) Stream 進(jìn)行截?cái)嗖僮饔昱@取其前 N 個(gè)元素 -
skip(long n)
返回一個(gè)丟棄原 Stream 的前 N 個(gè)元素后剩下元素組成的新 Stream
List<Integer> list = Arrays.asList(1, null, 1, 2, null, 5, 3, 9, 7);
list.stream().filter((s) -> s != null).limit(2).forEach((s) -> {
System.out.print(s + " ");
});
對(duì) Stream 進(jìn)行聚合(Reduce)操作
-
sum()
max()
count()
List<Integer> list = Arrays.asList(1, null, 1, 2, null, 5, 3, 9, 7);
IntStream is = list.stream().filter((s) -> s != null).mapToInt(Integer::intValue);
System.out.println(is.max());
collect
List<Integer> list = Arrays.asList(1, null, 1, 2, null, 5, 3, 9, 7);
List<Integer> result = list.stream().filter((s) -> s != null).collect(Collectors.toList());
result.forEach((s) -> {
System.out.print(s + " ");
});
-
reduce(BinaryOperator<T> accumulator)
sum()
max()
count()
等都可以使用reduce()
實(shí)現(xiàn)
reduce 方法接受一個(gè)函數(shù)谚攒,這個(gè)函數(shù)有兩個(gè)參數(shù):
第一個(gè)參數(shù) s1 是上次函數(shù)執(zhí)行的返回值(也稱為中間結(jié)果)
第二個(gè)參數(shù) s2 是 stream 中的元素阳准,這個(gè)函數(shù)把這兩個(gè)值相加氛堕,得到的和會(huì)被賦值給下次執(zhí)行這個(gè)函數(shù)的第一個(gè)參數(shù)
第一次執(zhí)行的時(shí)候第一個(gè)參數(shù)的值是 Stream 的第一個(gè)元素,第二個(gè)參數(shù)是 Stream 的第二個(gè)元素野蝇。
這個(gè)方法返回值類型是Optional讼稚。
List<Integer> list = Arrays.asList(1, null, 1, 2, null, 5, 3, 9, 7);
Optional<Integer> op = list.stream().filter((s) -> s != null).reduce((s1, s2) -> s1 + s2);
System.out.println(op.get()); // 相當(dāng)于求和
- 搜索相關(guān)
-
allMatch
是不是Stream中的所有元素都滿足給定的匹配條件 -
anyMatch
Stream中是否存在任何一個(gè)元素滿足匹配條件 -
findFirst
返回Stream中的第一個(gè)元素,如果Stream為空绕沈,返回空Optional -
noneMatch
是不是Stream中的所有元素都不滿足給定的匹配條件
-
List<Integer> list = Arrays.asList(1, null, 1, 2, null, 5, 3, 9, 7);
System.out.println(list.stream().filter((s) -> s != null).allMatch((s) -> s > 0));