那个网站百度收录快,劳务公司名称大全,宿州企业网站建设,做淘宝客网站推广被骗在前两篇博客中#xff0c;我介绍了构建 Stream 流的多种方式#xff0c;以及 Stream API 的中间操作#xff0c;如果你还没有阅读#xff0c;你可以点击这里和这里查看。 
Java基础 - Stream 流#xff1a;构建流的多种方式 
Java基础 - Stream 流#xff1a;Stream API…在前两篇博客中我介绍了构建 Stream 流的多种方式以及 Stream API 的中间操作如果你还没有阅读你可以点击这里和这里查看。 
Java基础 - Stream 流构建流的多种方式 
Java基础 - Stream 流Stream API的中间操作 
在这篇博客中我将探索 Stream API 的终端操作它们可以让你从 Stream 流中得到最终的结果或者产生一些副作用。 
Stream API 的终端操作是指那些会消耗 Stream 流产生一个最终的结果或者一个副作用的操作它们不能再链式地调用而是结束一个操作管道。Stream API 提供了很多终端操作可以分为以下几类 
归约这类操作可以让你将 Stream 流中的所有元素合并为一个值例如 reduce, sum, max, min, count 等。收集这类操作可以让你将 Stream 流中的所有元素收集到一个集合或者一个值中例如 collect, toList, toSet, toMap, joining 等。遍历这类操作可以让你对 Stream 流中的每个元素执行一个消费者Consumer操作例如 forEach, forEachOrdered 等。匹配这类操作可以让你判断 Stream 流中的元素是否满足一个条件例如 anyMatch, allMatch, noneMatch 等。查找这类操作可以让你从 Stream 流中找到一个元素例如 findAny, findFirst 等。 
下面我将用一些示例来展示这些终端操作的用法和效果。 
1. 归约 
1.1 reduce 
reduce 操作可以让你将 Stream 流中的所有元素按照一个二元操作BinaryOperator进行归约返回一个 Optional 对象它可能包含一个值也可能为空。你也可以指定一个初始值作为归约的起点。例如 
// 创建一个 Stream 流对象
StreamInteger numberStream  Stream.of(1, 2, 3, 4, 5);// 使用 reduce 操作将所有元素相加不指定初始值
OptionalInteger sum1  numberStream.reduce((a, b) - a  b);// 输出 Optional[15]
System.out.println(sum1);// 使用 reduce 操作将所有元素相加指定初始值为 0
int sum2  numberStream.reduce(0, (a, b) - a  b);// 输出 15
System.out.println(sum2);1.2 sum 
sum 操作可以让你将 Stream 流中的所有元素相加返回一个数值。你需要将 Stream 流转换为数值流例如 IntStream, LongStream, DoubleStream 等。例如 
// 创建一个 Stream 流对象
StreamInteger numberStream  Stream.of(1, 2, 3, 4, 5);// 使用 sum 操作将所有元素相加需要转换为 IntStream
int sum  numberStream.mapToInt(Integer::intValue).sum();// 输出 15
System.out.println(sum);1.3 max 
max 操作可以让你从 Stream 流中找到最大的元素返回一个 Optional 对象它可能包含一个值也可能为空。你可以指定一个比较器Comparator来定义元素的大小。例如 
// 创建一个 Stream 流对象
StreamString animalStream  Stream.of(cat, dog, elephant, fox, giraffe);// 使用 max 操作找到最大的元素按照自然顺序比较
OptionalString max1  animalStream.max(String::compareTo);// 输出 Optional[yellow]
System.out.println(max1);// 使用 max 操作找到最大的元素按照长度比较
OptionalString max2  animalStream.max((s1, s2) - s1.length() - s2.length());// 输出 Optional[elephant]
System.out.println(max2);1.4 min 
min 操作可以让你从 Stream 流中找到最小的元素返回一个 Optional 对象它可能包含一个值也可能为空。你可以指定一个比较器Comparator来定义元素的大小。例如 
// 创建一个 Stream 流对象
StreamString animalStream  Stream.of(cat, dog, elephant, fox, giraffe);// 使用 min 操作找到最小的元素按照自然顺序比较
OptionalString min1  animalStream.min(String::compareTo);// 输出 Optional[cat]
System.out.println(min1);// 使用 min 操作找到最小的元素按照长度比较
OptionalString min2  animalStream.min((s1, s2) - s1.length() - s2.length());// 输出 Optional[cat] 或者 Optional[dog] 或者 Optional[fox]
System.out.println(min2);1.5 count 
count 操作可以让你计算 Stream 流中的元素个数返回一个长整型。例如 
// 创建一个 Stream 流对象
StreamString animalStream  Stream.of(cat, dog, elephant, fox, giraffe);// 使用 count 操作计算元素个数
long count  animalStream.count();// 输出 5
System.out.println(count);2. 收集 
2.1 collect 
collect 操作可以让你将 Stream 流中的所有元素收集到一个集合或者一个值中返回一个收集结果。你需要指定一个收集器Collector来定义收集的规则。例如 
// 创建一个 Stream 流对象
StreamString animalStream  Stream.of(cat, dog, elephant, fox, giraffe);// 使用 collect 操作将所有元素收集到一个列表中使用预定义的收集器
ListString list  animalStream.collect(Collectors.toList());// 输出 [cat, dog, elephant, fox, giraffe]
System.out.println(list);// 使用 collect 操作将所有元素收集到一个字符串中使用自定义的收集器
String string  animalStream.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append).toString();// 输出 catdogelephantfoxgiraffe
System.out.println(string);2.2 toList 
toList 操作可以让你将 Stream 流中的所有元素收集到一个列表中返回一个列表。它是一个预定义的收集器可以直接使用。例如 
// 创建一个 Stream 流对象
StreamString animalStream  Stream.of(cat, dog, elephant, fox, giraffe);// 使用 toList 操作将所有元素收集到一个列表中
ListString list  animalStream.toList();// 输出 [cat, dog, elephant, fox, giraffe]
System.out.println(list);2.3 toSet 
toSet 操作可以让你将 Stream 流中的所有元素收集到一个集合中返回一个集合。它是一个预定义的收集器可以直接使用。它会去除重复的元素。例如 
// 创建一个 Stream 流对象
StreamString animalStream  Stream.of(cat, dog, cat, elephant, dog, fox);// 使用 toSet 操作将所有元素收集到一个集合中
SetString set  animalStream.toSet();// 输出 [cat, dog, elephant, fox]
System.out.println(set);2.4 toMap 
toMap 操作可以让你将 Stream 流中的所有元素收集到一个映射中返回一个映射。它是一个预定义的收集器可以直接使用。你需要指定一个键函数Key Function和一个值函数Value Function来定义映射的键和值。你也可以指定一个合并函数Merge Function来处理重复的键。例如 
// 创建一个 Stream 流对象
StreamString animalStream  Stream.of(cat, dog, elephant, fox, giraffe);// 使用 toMap 操作将所有元素收集到一个映射中以元素的首字母为键以元素的长度为值
MapString, Integer map1  animalStream.collect(Collectors.toMap(s - s.substring(0, 1), String::length));// 输出 {c3, d3, e8, f3, g7}
System.out.println(map1);// 使用 toMap 操作将所有元素收集到一个映射中以元素的长度为键以元素为值如果有重复的键就用逗号连接值
MapInteger, String map2  animalStream.collect(Collectors.toMap(String::length, s - s, (s1, s2) - s1  ,   s2));// 输出 {3cat, dog, fox, 8elephant, 7giraffe}
System.out.println(map2);2.5 joining 
joining 操作可以让你将 Stream 流中的所有元素连接成一个字符串返回一个字符串。它是一个预定义的收集器可以直接使用。你可以指定一个分隔符Delimiter来分隔元素也可以指定一个前缀Prefix和一个后缀Suffix来包裹字符串。例如 
// 创建一个 Stream 流对象
StreamString animalStream  Stream.of(cat, dog, elephant, fox, giraffe);// 使用 joining 操作将所有元素连接成一个字符串不指定分隔符前缀和后缀
String string1  animalStream.collect(Collectors.joining());// 输出 catdogelephantfoxgiraffe
System.out.println(string1);// 使用 joining 操作将所有元素连接成一个字符串指定分隔符为逗号前缀为左括号后缀为右括号
String string2  animalStream.collect(Collectors.joining(, , (, )));// 输出 (cat, dog, elephant, fox, giraffe)
System.out.println(string2);3. 遍历 
3.1 forEach 
forEach 操作可以让你对 Stream 流中的每个元素执行一个消费者Consumer操作不返回任何结果。它是一个终端操作会消耗 Stream 流。它不保证按照数据源的顺序执行如果需要保证顺序可以使用 forEachOrdered 操作。例如 
// 创建一个 Stream 流对象
StreamString animalStream  Stream.of(cat, dog, elephant, fox, giraffe);// 使用 forEach 操作对每个元素打印一个消息
animalStream.forEach(s - System.out.println(I like   s));// 可能输出 I like fox, I like dog, I like cat, I like elephant, I like giraffe3.2 forEachOrdered 
forEachOrdered 操作可以让你对 Stream 流中的每个元素按照数据源的顺序执行一个消费者Consumer操作不返回任何结果。它是一个终端操作会消耗 Stream 流。它保证按照数据源的顺序执行但可能会影响并行性能。例如 
// 创建一个 Stream 流对象
StreamString animalStream  Stream.of(cat, dog, elephant, fox, giraffe);// 使用 forEachOrdered 操作对每个元素按照数据源的顺序打印一个消息
animalStream.forEachOrdered(s - System.out.println(I like   s));// 输出 I like cat, I like dog, I like elephant, I like fox, I like giraffe4. 匹配 
4.1 anyMatch 
anyMatch 操作可以让你判断 Stream 流中是否有任意一个元素满足一个谓词Predicate返回一个布尔值。它是一个短路的终端操作只要找到一个满足条件的元素就会停止。例如 
// 创建一个 Stream 流对象
StreamString animalStream  Stream.of(cat, dog, elephant, fox, giraffe);// 使用 anyMatch 操作判断是否有以 f 开头的元素
boolean hasF  animalStream.anyMatch(s - s.startsWith(f));// 输出 true
System.out.println(hasF);4.2 allMatch 
allMatch 操作可以让你判断 Stream 流中是否所有的元素都满足一个谓词Predicate返回一个布尔值。它是一个短路的终端操作只要找到一个不满足条件的元素就会停止。例如 
// 创建一个 Stream 流对象
StreamString animalStream  Stream.of(cat, dog, elephant, fox, giraffe);// 使用 allMatch 操作判断是否所有的元素都包含 a
boolean allA  animalStream.allMatch(s - s.contains(a));// 输出 false
System.out.println(allA);4.3 noneMatch 
noneMatch 操作可以让你判断 Stream 流中是否没有任何一个元素满足一个谓词Predicate返回一个布尔值。它是一个短路的终端操作只要找到一个满足条件的元素就会停止。例如 
// 创建一个 Stream 流对象
StreamString animalStream  Stream.of(cat, dog, elephant, fox, giraffe);// 使用 noneMatch 操作判断是否没有以 z 结尾的元素
boolean noZ  animalStream.noneMatch(s - s.endsWith(z));// 输出 true
System.out.println(noZ);5. 查找 
5.1 findAny 
findAny 操作可以让你从 Stream 流中找到任意一个元素返回一个 Optional 对象它可能包含一个值也可能为空。它是一个短路的终端操作只要找到一个元素就会停止。它不保证返回第一个元素如果需要保证顺序可以使用 findFirst 操作。例如 
// 创建一个 Stream 流对象
StreamString animalStream  Stream.of(cat, dog, elephant, fox, giraffe);// 使用 findAny 操作找到任意一个元素
OptionalString anyAnimal  animalStream.findAny();// 输出 Optional[cat] 或者其他值
System.out.println(anyAnimal);5.2 findFirst 
findFirst 操作可以让你从 Stream 流中找到第一个元素返回一个 Optional 对象它可能包含一个值也可能为空。它是一个短路的终端操作只要找到第一个元素就会停止。它保证返回第一个元素但可能会影响并行性能。例如 
// 创建一个 Stream 流对象
StreamString animalStream  Stream.of(cat, dog, elephant, fox, giraffe);// 使用 findFirst 操作找到第一个元素
OptionalString firstAnimal  animalStream.findFirst();// 输出 Optional[cat]
System.out.println(firstAnimal); 文章转载自: http://www.morning.xnltz.cn.gov.cn.xnltz.cn http://www.morning.lqlc.cn.gov.cn.lqlc.cn http://www.morning.tqdlk.cn.gov.cn.tqdlk.cn http://www.morning.rbmnq.cn.gov.cn.rbmnq.cn http://www.morning.pctsq.cn.gov.cn.pctsq.cn http://www.morning.dkqyg.cn.gov.cn.dkqyg.cn http://www.morning.zlcsz.cn.gov.cn.zlcsz.cn http://www.morning.lzttq.cn.gov.cn.lzttq.cn http://www.morning.bxgpy.cn.gov.cn.bxgpy.cn http://www.morning.hxmqb.cn.gov.cn.hxmqb.cn http://www.morning.rfhwc.cn.gov.cn.rfhwc.cn http://www.morning.ftntr.cn.gov.cn.ftntr.cn http://www.morning.rcgzg.cn.gov.cn.rcgzg.cn http://www.morning.qzpw.cn.gov.cn.qzpw.cn http://www.morning.eronghe.com.gov.cn.eronghe.com http://www.morning.sooong.com.gov.cn.sooong.com http://www.morning.rdxp.cn.gov.cn.rdxp.cn http://www.morning.nbgfk.cn.gov.cn.nbgfk.cn http://www.morning.bpwfr.cn.gov.cn.bpwfr.cn http://www.morning.xbzfz.cn.gov.cn.xbzfz.cn http://www.morning.hlnys.cn.gov.cn.hlnys.cn http://www.morning.qxwgx.cn.gov.cn.qxwgx.cn http://www.morning.rbnp.cn.gov.cn.rbnp.cn http://www.morning.rtsx.cn.gov.cn.rtsx.cn http://www.morning.qcbhb.cn.gov.cn.qcbhb.cn http://www.morning.knscf.cn.gov.cn.knscf.cn http://www.morning.lynkz.cn.gov.cn.lynkz.cn http://www.morning.lhgqc.cn.gov.cn.lhgqc.cn http://www.morning.mlntx.cn.gov.cn.mlntx.cn http://www.morning.mtbsd.cn.gov.cn.mtbsd.cn http://www.morning.pzrpz.cn.gov.cn.pzrpz.cn http://www.morning.ztnmc.cn.gov.cn.ztnmc.cn http://www.morning.mwnch.cn.gov.cn.mwnch.cn http://www.morning.fydsr.cn.gov.cn.fydsr.cn http://www.morning.lhxrn.cn.gov.cn.lhxrn.cn http://www.morning.fglyb.cn.gov.cn.fglyb.cn http://www.morning.jwefry.cn.gov.cn.jwefry.cn http://www.morning.dgckn.cn.gov.cn.dgckn.cn http://www.morning.lbhck.cn.gov.cn.lbhck.cn http://www.morning.pffqh.cn.gov.cn.pffqh.cn http://www.morning.dbjyb.cn.gov.cn.dbjyb.cn http://www.morning.gsjw.cn.gov.cn.gsjw.cn http://www.morning.zbqsg.cn.gov.cn.zbqsg.cn http://www.morning.prysb.cn.gov.cn.prysb.cn http://www.morning.qlpyn.cn.gov.cn.qlpyn.cn http://www.morning.gybnk.cn.gov.cn.gybnk.cn http://www.morning.rkkh.cn.gov.cn.rkkh.cn http://www.morning.pbpcj.cn.gov.cn.pbpcj.cn http://www.morning.ltksw.cn.gov.cn.ltksw.cn http://www.morning.blqgc.cn.gov.cn.blqgc.cn http://www.morning.ywpwq.cn.gov.cn.ywpwq.cn http://www.morning.sjsks.cn.gov.cn.sjsks.cn http://www.morning.qmpbs.cn.gov.cn.qmpbs.cn http://www.morning.ftzll.cn.gov.cn.ftzll.cn http://www.morning.fycjx.cn.gov.cn.fycjx.cn http://www.morning.fxzw.cn.gov.cn.fxzw.cn http://www.morning.gyxwh.cn.gov.cn.gyxwh.cn http://www.morning.dwxqf.cn.gov.cn.dwxqf.cn http://www.morning.pqcbx.cn.gov.cn.pqcbx.cn http://www.morning.hilmwmu.cn.gov.cn.hilmwmu.cn http://www.morning.rjjjk.cn.gov.cn.rjjjk.cn http://www.morning.qzpsk.cn.gov.cn.qzpsk.cn http://www.morning.jcyrs.cn.gov.cn.jcyrs.cn http://www.morning.bwrbm.cn.gov.cn.bwrbm.cn http://www.morning.qwbls.cn.gov.cn.qwbls.cn http://www.morning.dxzcr.cn.gov.cn.dxzcr.cn http://www.morning.drnjn.cn.gov.cn.drnjn.cn http://www.morning.xxwl1.com.gov.cn.xxwl1.com http://www.morning.gktds.cn.gov.cn.gktds.cn http://www.morning.gtmdq.cn.gov.cn.gtmdq.cn http://www.morning.lgkbn.cn.gov.cn.lgkbn.cn http://www.morning.btlmb.cn.gov.cn.btlmb.cn http://www.morning.nfyc.cn.gov.cn.nfyc.cn http://www.morning.xwzsq.cn.gov.cn.xwzsq.cn http://www.morning.bqppr.cn.gov.cn.bqppr.cn http://www.morning.qzdxy.cn.gov.cn.qzdxy.cn http://www.morning.stwxr.cn.gov.cn.stwxr.cn http://www.morning.ydxg.cn.gov.cn.ydxg.cn http://www.morning.jhkzl.cn.gov.cn.jhkzl.cn http://www.morning.yfpnl.cn.gov.cn.yfpnl.cn