stream()相关

162 阅读2分钟

在Java中,stream()方法是集合框架的一部分,允许集中处理数据集合。

1. stream() 方法

stream() 方法可以在任何实现了Collection接口的集合上被调用(例如,ListSet等),它会返回一个表示该集合的顺序流。

List<DealerSalerMore> dealerSalerMoreList = // 初始化列表
Stream<DealerSalerMore> stream = dealerSalerMoreList.stream();

2. 流操作的分类

流的操作主要分为两类:中间操作 和 终端操作

中间操作(Intermediate Operations)

中间操作返回一个新的流,可以进行链式调用。这些操作是惰性求值的,即只有在终端操作执行时才会执行这些操作。常见的中间操作包括:

  • filter:用于过滤流中的元素。该函数返回 true 或 false
    Stream<DealerSalerMore> filteredStream = stream
        .filter(dealer -> "0".equals(dealer.getState()));
    
  • map:用于将流中的每个元素转换为另一种类型,接收一个 Function
    Stream<String> idStream = filteredStream
        .map(DealerSalerMore::getDealerId);
    
  • sorted:对流的元素进行排序。
    Stream<DealerSalerMore> sortedStream = stream
        .sorted(Comparator.comparing(DealerSalerMore::getSomeProperty));
    
  • distinct:去除流中重复的元素。
    Stream<DealerSalerMore> distinctStream = stream
        .distinct();
    

终端操作(Terminal Operations)

终端操作产生一个结果,或者产生副作用。一旦执行了终端操作,流就被消耗,无法再使用。常见的终端操作包括:

  • collect:将流中的元素收集到集合中,通常用于返回一个列表、集合或映射。

    List<String> dealerIdList = idStream
        .collect(Collectors.toList());
    
  • forEach:对流中的每个元素执行操作。

    idStream.forEach(System.out::println);
    
  • reduce:对流中的元素进行归约操作,将多个元素合并成一个结果。

    Optional<String> result = idStream
        .reduce((s1, s2) -> s1 + ", " + s2);
    
  • count:返回流中元素的数量。

    long count = stream.count();
    

综合示例

List<A> aList = aMapper.getAllAByAId(map.get("AId"));
List<String> tempAList = aList.stream()
    .filter(f -> "0".equals(f.getState()) || "0".equals(f.getDr())) // 过滤
    .map(A::getAName) // 提取 AName
    .collect(Collectors.toList()); // 收集到 List<String>

例子表:

| AName | State | Dr | 
| Name1 | 0 | 1 | 
| Name2 | 1 | 0 | 
| Name3 | 1 | 1 | 
| Name4 | 0 | 0 |
  • 过滤获得status等于0或者dr等于0的值
| Name1 | 0 | 1 | 
| Name2 | 1 | 0 | 
| Name4 | 0 | 0 |
  • 保留AName
| Name1 |
| Name2 | 
| Name4 | 
  • 重新转Collection