定义
- 官方定义的一组高阶函数的工具API
数据流
public static void main(String[] args) {
// 定义一个对象流
Stream<Fruit> objectStream = Stream.of(
new Fruit("草莓","strawberry","浆果","红色"),
new Fruit("桑葚","mulberry","浆果","黑色"),
new Fruit("樱桃","cherry","浆果","红色"),
new Fruit("蓝莓","blueberry","浆果","蓝色"),
new Fruit("核桃","walnut","坚果","棕色"),
new Fruit("杏仁","almond","坚果","棕色")
);
}
record Fruit(String cname,String name,String category,String color){
}
过滤-filter
// filter 过滤得到所有的浆果并且颜色是红色的 并打印
objectStream.filter(fruit -> "浆果".equals(fruit.category))
.filter(fruit -> "红色".equals(fruit.color))
.forEach(System.out::println);
映射-map
Fruit::cname 这是方法引用,但是这种写法是record特有的
// map 映射 将对象流中所有的水果变成果酱 并打印
fruitStream.map(Fruit::cname)
.map(cname -> cname + "酱")
.forEach(System.out::println);
扁平化(降维)-flatMap
- 我们可以ctrl + p 查看一下参数Function的类型
- 第一个参数是一个List,这个是
入参
:代表Stream中的每一个元素的类型都是List<Fruit>
类型的- 第二个参数是返回结果:代表最后会返回一个
Stream<Fruit>
类型的流给你
// 二维流
Stream<List<Fruit>> stream = Stream.of(
List.of(
new Fruit("草莓", "strawberry", "浆果", "红色"),
new Fruit("桑葚", "mulberry", "浆果", "黑色"),
new Fruit("樱桃", "cherry", "浆果", "红色"),
new Fruit("蓝莓", "blueberry", "浆果", "蓝色")
),
List.of(
new Fruit("核桃", "walnut", "坚果", "棕色"),
new Fruit("杏仁", "almond", "坚果", "棕色")
)
);
// flatMap 将二维流转换为一维流
// 方法引用 List::stream 等价于 list -> list.stream() 将每一个list转换为流
stream.flatMap(List::stream)
.forEach(System.out::println);
构建流-stream、of
基于集合或者map创建流
// 基于已有集合来创建流
Stream<Integer> intStream = List.of(1, 2, 3, 4).stream();
// map无法直接变成流 但是可以通过entrySet变成set 通过set再变成流
Stream<Entry<Integer, String>> mapStream = Map.of(1, "a", 2, "b").entrySet().stream();
基于数组创建流
// 基于数组来创建流
int[] arr = {
1, 2, 3, 4};
Stream<int[]> arrStream = Stream.of(arr);
基于对象创建流
// 定义一个对象流
Stream<Fruit> fruitStream = Stream.of(
new Fruit("草莓", "strawberry", "浆果", "红色"),
new Fruit("桑葚", "mulberry", "浆果", "黑色")
);
合并与截取
合并
// concat 连接两个流
System.out.println("concat 连接两个流");
Stream.concat(stream1