作用:一个终端操作,用于对流中的数据进行归集操作,collect方法接受的参数是一个Collector
有两个重载方法,在Stream接口中
// 重载方法一 <R> R collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner); // 重载方法二 <R, A> R collect(Collector<? super T, A, R> collector);String类型List集合排序例子,之前也有写过
// 创建list List<String> stringList = Arrays.asList("java", "python", "golang", "C#", "Julia", "shell"); // 排序 List<String> collect = stringList.stream().sorted().collect(Collectors.toList()); // 遍历输出 collect.forEach(System.out::println); 运行结果: C# Julia golang java python shell以上代码的Collectors.toList()改成toSet()就相当于将List转成set,这种方式可以用于list滤重。
Collectors.toMap() Collectors.toSet() Collectors.toCollection() :用自定义的实现Collection的数据结构收集 Collectors.toCollection(LinkedList::new) Collectors.toCollection(CopyOnWriteArrayList::new) Collectors.toCollection(TreeSet::new)
一般默认提供的toList、toMap、toSet就够用了。
一般用作字符串拼接
//3种重载⽅方法 Collectors.joining() Collectors.joining("param") Collectors.joining("param1", "param2", "param3")字符串数组拼接样例
List<String> stringList = Arrays.asList("abc", "spring", "java", "python"); // 单纯拼接 String result = stringList.stream().collect(Collectors.joining("")); System.out.println(result); // 拼接间加入分隔符 String result1 = stringList.stream().collect(Collectors.joining("--")); System.out.println(result1); // 加大括号 String result2 = stringList.stream().collect(Collectors.joining("--", "{", "}")); System.out.println(result2);javastream流可以使用stream.of()直接创建
String result = Stream.of("springboot","mysql","html5","css3").collect(Collectors.joining(",", "[", "]"));collectors.partitioningBy分组,key是boolean类型
public static <T> Collector<T, ?, Map<Boolean, List<T>>> partitioningBy(Predicate<? superT> predicate) { return partitioningBy(predicate, toList()); }例子:将list中字符串长度大于4的为一组,其他为另一组
List<String> stringList = Arrays.asList("abc", "spring", "java", "python"); Map<Boolean, List<String>> result = stringList.stream().collect(Collectors.partitioningBy(obj -> obj.length() > 4)); System.out.println(result);例子:根据学生所在的省份进行分组
public class GroupingByDemo01 { public static void main(String[] args) { List<Student> students = Arrays.asList(new Student("辽宁", 18), new Student("吉林", 19), new Student("辽宁", 23), new Student("吉林", 20), new Student("辽宁", 24), new Student("吉林", 23)); Map<String, List<Student>> result = students.stream().collect(Collectors.groupingBy(obj -> obj.getProvince())); // 遍历结果 result.forEach((key,value)->{ System.out.println("--------------------"); System.out.println(key); value.forEach(obj->{ System.out.println(obj.getAge()); }); }); } } class Student{ private String province; private int age; public Student(String province, int age) { this.province = province; this.age = age; } public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 运行结果: -------------------- 吉林 19 20 23 -------------------- 辽宁 18 23 24例子:统计各省份人数
public class GroupingByDemo01 { public static void main(String[] args) { List<Student> students = Arrays.asList(new Student("辽宁", 18), new Student("吉林", 19), new Student("辽宁", 23), new Student("吉林", 20), new Student("黑龙江", 24), new Student("北京", 23)); Map<String, Long> result = students.stream().collect(Collectors.groupingBy(Student::getProvince,Collectors.counting())); // 结果遍历 result.forEach((key,value)->{ System.out.println(key+"省 学生人数:"+value); }); } } class Student{ private String province; private int age; public Student(String province, int age) { this.province = province; this.age = age; } public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } 运行结果: 黑龙江省 学生人数:1 吉林省 学生人数:2 辽宁省 学生人数:2 北京省 学生人数:1summarizing统计
public static <T> Collector<T, ?, IntSummaryStatistics> summarizingInt(ToIntFunction<? super T> mapper) { return new CollectorImpl<T, IntSummaryStatistics, IntSummaryStatistics>( IntSummaryStatistics::new, (r, t) -> r.accept(mapper.applyAsInt(t)), (l, r) -> { l.combine(r); return l; }, CH_ID ); }默认有summarizingInt,summarizingLong,summarizingDouble这三种分别统计不同数据类型的数据
例子:统计一些人的年龄信息,如平均年龄,人数,最小,最大
public static void main(String[] args) { List<Student> students = Arrays.asList(new Student("辽宁", 18), new Student("吉林", 19), new Student("辽宁", 23), new Student("吉林", 20), new Student("辽宁", 24), new Student("吉林", 23)); IntSummaryStatistics result = students.stream().collect(Collectors.summarizingInt(Student::getAge)); System.out.println("人数:"+result.getCount()); System.out.println("年龄总和:"+result.getSum()); System.out.println("最小年龄:"+result.getMin()); System.out.println("最大年龄:"+result.getMax()); System.out.println("平均年龄:"+result.getAverage()); } 运行结果: 人数:6 年龄总和:127 最小年龄:18 最大年龄:24 平均年龄:21.166666666666668