转载

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 实例,需要调用get()获取实际的对象实例。

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);
}

运行结果:

count方法的目的为获取流中元素总数

版权声明:

原创不易,洗文可耻。除非注明,本博文章均为原创,转载请以链接形式标明本文地址。

原文  http://wuwenliang.net/2020/05/17/Java8函数式编程之Stream编程详解-2-终端操作/
正文到此结束
Loading...