Java8函数式编程之Stream编程详解(2)终端操作
文章目录
上文中主要学习了Stream编程中的中间操作,本文我们接着分析终端操作,它分为短路和非短路操作。
我们提前明确一个原则:一个流一旦经过终端操作,就不能进行后续操作了。
allMatch: 检测所有元素是否满足断言,如果都满足返回true,有一个不满足返回false
@Test
public void allMatchTest() {
boolean isMatch = list.stream()
// 打印出部门商品名称即结束,参考打印结果
.peek(sku -> System.out.println(sku.getSkuName()))
// allMatch是短路操作
.allMatch(sku -> sku.getTotalPrice() > 100);
System.out.println(isMatch);
}
运行结果:
无人机
VR一体机
牛仔裤
false
我们知道list集合一共有6个元素,但是遍历了三个就结束遍历。这恰好印证了
allMatch操作是是短路操作,只要有不满足的就返回;只有所有元素匹配才返回true
anyMatch: 只有有元素满足断言判断就返回true,否则返回false (存在至少一个满足条件的元素即是true)
@Test
public void anyMatchTest() {
boolean isMatch = list.stream()
.peek(sku -> System.out.println(sku.getSkuName()))
.anyMatch(sku -> sku.getTotalPrice() > 100);
System.out.println(isMatch);
}
运行结果:
无人机
true
无人机.getTotalPrice() > 100 刚好满足,因此anyMatch直接返回true。可见anyMatch也是短路操作,任何元素匹配断言则返回true
noneMatch: 只有所有元素都不满足断言判断才返回true,否则返回false
@Test
public void noneMatchTest() {
boolean isMatch = list.stream()
.peek(sku -> System.out.println(sku.getSkuName()))
.noneMatch(sku -> sku.getTotalPrice() > 10_000);
System.out.println(isMatch);
}
运行结果:
无人机
VR一体机
牛仔裤
衬衫
Java编程思想
程序化广告
true
实例数据中的所有的数据价格都没有超过10000,因此noneMatch断言均满足,所以返回true。
noneMatch的含义就是全不匹配就是true
findFirst:找到第一个元素
@Test
public void findFirstTest() {
Optional<Sku> optional = list.stream()
.peek(sku -> System.out.println(sku.getSkuName()))
.findFirst();
System.out.println(JSON.toJSONString(optional.get()));
}
运行结果:
无人机
{"skuCategory":"ELECTRONICS","skuId":2,"skuName":"无人机","skuPrice":1000.0,"totalNum":10,"totalPrice":1000.0}
这个方法没什么特别注意的,我们只需要记住findFirst返回一个 Optional
findAny:找到任意一个元素,只要有元素就返回
@Test
public void findAnyTest() {
Optional<Sku> optional = list.stream()
.peek(sku -> System.out.println(sku.getSkuName()))
.findAny();
System.out.println(JSON.toJSONString(optional.get()));
}
运行结果:
无人机
{"skuCategory":"ELECTRONICS","skuId":2,"skuName":"无人机","skuPrice":1000.0,"totalNum":10,"totalPrice":1000.0}
findAny的语义是:
找到任意一个元素,只要有元素就返回;与findFirst相比,如果是并行操作,findAny更快,因为是随机匹配的;
如果是串行操作,则与findFirst花费时间相差无几
max:获取流中某条件下最大值
@Test
public void maxTest() {
OptionalDouble optionalDouble = list.stream()
// 提取出价格 数据类型为double mapToDouble将元素映射为double元素,返回一个doubleStream流
.mapToDouble(Sku::getTotalPrice)
// 提取最大值
.max();
System.out.println(optionalDouble.getAsDouble());
}
运行结果:
2100.0
max方法,字面意思就是获取流中的最大值。
在实例中,通过mapToDouble将元素映射为double元素,通过max方法获取其中的最大值。
min:获取流中某条件下最小值
@Test
public void minTest() {
OptionalDouble optionalDouble = list.stream()
// 提取出价格 数据类型为double mapToDouble将元素映射为double元素,返回一个doubleStream流
.mapToDouble(Sku::getTotalPrice)
// 提取最小值
.min();
System.out.println(optionalDouble.getAsDouble());
}
运行结果:
60.0
min与max 刚好相反,字面意思就是获取流中的最小值。
count:获取流中元素的个数
@Test
public void countTest() {
long count = list.stream()
// 提取出价格 数据类型为double mapToDouble将元素映射为double元素,返回一个doubleStream流
.mapToDouble(Sku::getTotalPrice)
// 提取总数
.count();
System.out.println(count);
}
运行结果:
6
count方法的目的为获取流中元素总数
版权声明:
原创不易,洗文可耻。除非注明,本博文章均为原创,转载请以链接形式标明本文地址。