Java基础 Stream 流的终结方法

发布时间 2023-10-19 21:09:48作者: 嘎嘎鸭2

void  forEach ( Consumer  action )   →   遍历

long  count ()   →   统计

toArray ()   →   收集流中的数据,放到数组中

collect ( Collector  collector )   →   收集流中的数据,放到集合中

 

 

count () 方法:

ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "张三-15", "李四-16", "王五-17", "赵六-18");
long count = list.stream().count();
System.out.println(count); // 输出 4



toArray () 方法:
toArray () 方法的参数的作用:负责创建一个指定类型的数组
toArray () 方法的底层 会依次得到流里面的每一个数据,并把数据放到数组当中
toArray () 方法的返回值:是一个装着流里面所有数据的数组

eg:
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "张三", "李四", "王五", "赵六");

// IntFunction 的泛型:具体类型的数组(以 String 为例)
String[] arr = list.stream().toArray(new IntFunction<String[]>() {
@Override
public String[] apply(int value) {
// apply 方法的形参 value 表示流中数据的个数,要跟数组的长度保持一致(流里面有多少个数据,数组的长度就是多少)
// apply 方法的返回值:具体类型的数组,类型与 IntFunction 的泛型保持一致
// apply 方法的反方法体:就是创建数组
return new String[value];
}
});
System.out.println(Arrays.toString(arr)); // 打印结果:[张三, 李四, 王五, 赵六]




collect(Collector collector) 方法:收集流中的数据,放到集合中(List Set Map)
1. 收集到 List 集合当中:
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "张三-男-15", "李四-女-16", "王五-女-17", "赵六-男-18");
List<String> newList = list.stream().collect(Collectors.toList());
System.out.println(newList);

2. 收集到 Set 集合当中:
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "张三-男-15", "李四-女-16", "王五-女-17", "赵六-男-18");
Set<String> newList = list.stream().collect(Collectors.toSet());
System.out.println(newList);

3. 收集到 Map 集合当中:(要规定谁作为键,谁作为值)
注意:如果我们要收集到Map集合当中,键不能重复,否则会报错
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "张三-15", "李四-16", "王五-17", "赵六-18");

//toMap方法的两个形参:第一个表示键的生成规则,第二个表示值的生成规则
Map<String, Integer> map = list.stream().collect(Collectors.toMap(new Function<String, String>() {//第一个泛型表示流里面数据的类型,第二个泛型表示Map集合当中键的类型
@Override
public String apply(String s) {//形参 s 依次表示流里面的每一个数据。apply方法体的作用:生成键。返回值:生成的键
return s.split("-")[0];
}
}, new Function<String, Integer>() {//第一个泛型表示流里面数据的类型,第二个泛型表示Map集合当中值的类型
    @Override
public Integer apply(String s) {//形参 s 依次表示流里面的每一个数据。apply方法体的作用:生成值。返回值:生成的值
        return Integer.parseInt(s.split("-")[1]);
    }
}));

System.out.println(map); //打印结果:{李四=16, 张三=15, 王五=17, 赵六=18}

简写形式:
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "张三-15", "李四-16", "王五-17", "赵六-18");

Map<String, Integer> map = list.stream()
.collect(Collectors.toMap(s -> s.split("-")[0], s -> Integer.parseInt(s.split("-")[1])));

System.out.println(map);