Java8中你可能不知道的一些地方之Stream实战二

530 阅读6分钟

流的终止操作

终止操作会从流的流水线生成结果。其结果是任何不是流的值,比如常见的List、 Integer,甚 至void等结果。对于流的终止操作,分为以下三类:

查找与匹配

  • 筛选有效订单 匹配是否全部为已支付订单
 // 筛选有效订单 匹配是否全部为已支付订单
System.out.println("allMatch匹配结果:" + 
                     ordersList.stream()
                     .filter((order) -> order.getIsValid() == 1)
                  .allMatch((o) -> o.getStatus() != 0)
                  );
  • 筛选有效订单 匹配是否存在未支付订单
// 筛选有效订单 匹配是否存在未支付订单
System.out.println("anyMatch匹配结果:" + 
                     ordersList.stream()
                        .filter((order) -> order.getIsValid() == 1)
                        .anyMatch((o) -> o.getStatus() == 0)
                  );
  • 筛选有效订单 全部未完成订单
// 筛选有效订单 全部未完成订单
System.out.println("noneMatch匹配结果:" + 
                    ordersList.stream()
                     .filter((order) -> order.getIsValid() == 1)
                     .noneMatch((o) -> o.getStatus() == 5)
                  );
  • 筛选有效订单 返回第一条订单
  // 筛选有效订单 返回第一条订单
        System.out.println("findAny匹配结果:"+
                            ordersList.stream()
                                .filter((order) -> order.getIsValid() == 1)
                                .findAny()
                                 .get()
                          );
  • 筛选所有有效订单 返回订单总数
//  筛选所有有效订单 返回订单总数
        System.out.println("count结果:" + 
                            ordersList.stream()
                                .filter((order) -> order.getIsValid() == 1)
                                .count()
                        );
  • 筛选有效订单 返回金额最大订单金额
// 筛选有效订单 返回金额最大订单金额
        System.out.println("订单金额最大值:" + 
                            ordersList.stream()
                                .filter((order) -> order.getIsValid() == 1)
                                .map(Order::getTotal)
                                .max(Double::compare)
                                .get()
                          );
  • 筛选有效订单 返回金额最小订单金额
// 筛选有效订单 返回金额最小订单金额
        System.out.println("订单金额最小值:" + 
                                ordersList.stream()
                                    .filter((order) -> order.getIsValid() == 1)
                                    .map(Order::getTotal)
                                    .min(Double::compare)
                                    .get()
                          );

归约&收集

1 归约

将流中元素反复结合起来,得到一个值的操作

  • 计算有效订单总金额
// 计算有效订单总金额
        System.out.println("有效订单总金额:" + 
                            ordersList.stream()
                                .filter((order) -> order.getIsValid() == 1)
                                .map(Order::getTotal)
                                .reduce(Double::sum)
                                .get()
                          );

2 Collector数据收集

将流转换为其他形式,coollect 方法作为终端操作, 接收一个Collector接口的实现,用于给Stream中元素做汇总的方法。最常用的方法,把流中所有元素收集到一个 List, Set 或 Collection中。

3 集合收集

常用集合收集方法 toList、toSet、toCollection、toMap等

  • 筛选所有有效订单 并收集订单列表
// 筛选所有有效订单并收集订单列表
ordersList.stream()
    .filter((order) -> order.getIsValid() == 1)
    .collect(Collectors.toList())
    .forEach(System.out::println);
  • 筛选所有有效订单并收集订单号与订单金额
// 筛选所有有效订单 并收集订单号 与 订单金额
Map<String,Double> map=ordersList.stream().filter((order) -> order.getIsValid() == 1).
    collect(Collectors.toMap(Order::getOrderNo, Order::getTotal));
// java8 下对map进行遍历操作 如果 Map的Key重复,会报错
map.forEach((k,v)->{
    System.out.println("k:"+k+":v:"+v);
});