上文中主要学习了Stream编程中的中间操作,本文我们接着分析终端操作,它分为短路和非短路操作。
我们提前明确一个原则:一个流一旦经过终端操作,就不能进行后续操作了。
@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
@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
@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
@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花费时间相差无几
@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方法获取其中的最大值。
@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 刚好相反,字面意思就是获取流中的最小值。
@Test public void countTest() { long count = list.stream() // 提取出价格 数据类型为double mapToDouble将元素映射为double元素,返回一个doubleStream流 .mapToDouble(Sku::getTotalPrice) // 提取总数 .count(); System.out.println(count); }
运行结果:
count方法的目的为获取流中元素总数
版权声明:
原创不易,洗文可耻。除非注明,本博文章均为原创,转载请以链接形式标明本文地址。