💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
### Stream(惰性求值) Collection 是一种静态的内存数据结构,而 Stream 是有关计算的。前者是主要面向内存,存储在内存中,后者主要是面向 CPU,通过 CPU 实现计算。 集合讲的是数据,流讲的是计算。 **注意点** 1. Stream 自己不会存储元素。 2. Stream 不会改变源对象 相反 它会返回一个持有结果的新的Stream。 3. Stream 操作是延迟的 只有在需要结果的情况下才会执行一系列的流操作。 ## Stream操作 ### 1. Stream 创建 1. list.stream() or list.parallelStream() 2. Arrays.stream(new Integer[10]) 数组流 3. Stream.of(1,2,3) 通过of方法 4. IntStream Stream.iterate(1,t->t+1) 无限流 ### 2. Stream 中间操作 #### filter筛选=过滤 list.stream().filter(e->e.getAge>35).forEach(System.out::println) #### limit切片 list.stream().filter(e->e.getAge>35).limit(3).forEach(System.out::println) #### skip 跳过前面n个元素 与limit互补、 list.stream().skip(3).forEach(System.out::print); #### distinct去重 通过hashcode和equals进行去重的。 list.stream().distinct().forEach(System.out::print); #### Map flatMap映射 Map将流中的的元素经过处理转换成别的元素 成为一个新的Stream。 flatMap接受一个函数作为参数 将流中的每一个值都换成另一个流 然后把所有的流连接成一个新的流。 Map和flatMap处理返回一个流的函数的时候类似于add和addAll list.map(Car::getName).forEach(System.out::println) #### sort排序 1. 自然排序 sorted()--自然排序(Comparable) 2. 定制排序 sorted(Comparator com) list.stream().sorted((x, y) -> -Integer.compare(x, y)).forEach(System.out::println); ### 3. 终止操作 1. allMatch 检查是否匹配所有元素 2. anyMatch 检查是否至少匹配一个元素 3. noneMatch 检查是否没有匹配的元素 4. findFirst 返回第一个元素 5. findAny 返回当前流中的任意元素 6. count 返回流中元素的总个数 7. max 返回流中最大值 8. min 返回流中最小值 #### 9. reduce 归约 将流中元素反复结合起来 生成一个新的值(就是对流中元素进行累加求值)。 list.stream().reduce(0, Integer::sum);//第一个参数为起始值 后面一次运用前一次生成的值和当前的值累加起来。 Optional<Integer> sum = list.stream().reduce(Integer::sum); #### 10.collect收集 将一种流转换为其他的形式。接收一个Collector接口的实现,用于给Streamz中元素做汇总的方法。 collect方法接收一个Collector的接口,但是Collectors实用类提供了很多的静态方法,可以方便的创建常见收集器实例。 ```java // 收集 cars.stream().map(Car::getName) .collect(Collectors.toList()); // 求平均值 cars.stream() .collect(Collectors.averagingDouble(Car::getAge)); // 分组 Map<Integer, List<Car>> map = cars.stream() .collect(Collectors.groupingBy(Car::getId)); // 多级分组 cars.stream() .collect(Collectors.groupingBy( Car::getId, Collectors.groupingBy(Car::getName) )); // 分区 true为一部分 false为一部分 Map<Boolean, List<Car>> maps = cars.stream() .collect(Collectors.partitioningBy(t -> t.getAge() > 30)); ```