Lambda表达式Stream使用
==来自 【 Java8 In Action】 一书==
四种方法引用类型
| 类型 | 示例 |
|---|---|
| 引用静态方法 | ContainingClass::staticMethodName |
| 引用某个对象的实例方法 | containingObject::instanceMethodName |
| 引用某个类型的任意对象的实例方法 | ContainingType::methodName |
| 引用构造方法 | ClassName::new |
筛选和切片:

去重:


截取:


跳过元素:

对流中每个元素应用函数:

流的扁平化(合并流):
给 定 单 词 列 表[“Hello”,”World”] ,返回列表 [“H”,”e”,”l”, “o”,”W”,”r”,”d”] 。

使用 flatmap 合并流

判断是否至少匹配一个元素:
1 | if(menu.stream().anyMatch(Dish::isVegetarian())) { |
判断是否匹配所有元素:
1 | if(menu.stream().allMatch(Dish::isVegetarian())) { |
查找第一个元素:
1 | List<Integer> someNumbers = Arrays.asList(1, 2, 3, 4, 5); |
归约操作
元素求和:
1 | // 传统写法 |
最大值和最小值:
1 | Optional<Integer> max = numbers.stream().reduce(Integer::max); |
数值流:
1 | int calories = menu.stream().map(Dish::getCalories).reduce(0, Integer::sum); |
它有一个暗含的装箱成本。每个 Integer 都必须拆箱成一个原始类型,再进行求和。
Java8 中引入了三个原始类型流接口: IntStream 、 DoubleStream 和LongStream ,分别将流中的元素特化为 int 、 long 和 double ,从而避免了暗含的装箱成本。
1、映射到数值流
1 | menu.stream().mapToInt(xxxx).sum(); |
2、映射到对象流
1 | IntStream intStream = menu.stream().mapToInt(xxxx); |
数值范围:
1 | IntStream evenNumbers = IntStream.rangeClosed(1, 100) |
创建流的几种方式
1、由值创建流:
1 | Stream<String> stream = Stream.of("Java 8 ", "Lambdas ", "In ", "Action"); |
2、由数组创建流:
1 | int[] numbers = {2, 3, 5, 7, 11, 13}; |
3、由函数生成流:
Stream API提供了两个静态方法来从函数生成流: Stream.iterate 和 Stream.generate 。这两个操作可以创建所谓的无限流:不像从固定集合创建的流那样有固定大小的流。由 iterate和 generate 产生的流会用给定的函数按需创建值,因此可以无穷无尽地计算下去!一般来说,应该使用 limit(n) 来对这种流加以限制,以避免打印无穷多个值。
1 | Stream.iterate(0, n -> n + 2) |
1 | Stream.generate(Math::random) |