JDK8新特性笔记(七):收集器和集合统计

JDK8新特性笔记(七):收集器和集合统计

1.collector收集器

作用:一个终端操作,用于对流中的数据进行归集操作,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就够用了。

2.Joining函数 拼接

一般用作字符串拼接

//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);java

stream流可以使用stream.of()直接创建

String result = Stream.of("springboot","mysql","html5","css3").collect(Collectors.joining(",", "[", "]"));

3.partitioningBy 函数 分组

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);

4.grouping by 分组

单纯分组

public static <T, K> Collector<T, ?, Map<K, List<T>>> groupingBy(Function<? super T, ? extends K> classifier) { 
    return groupingBy(classifier, toList());
}

例子:根据学生所在的省份进行分组

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 static <T, K, A, D> Collector<T, ?, Map<K, D>>
groupingBy(Function<? super T, ? extends K> classifier,Collector<? super T, A, D> downstream) {
	return groupingBy(classifier, HashMap::new, downstream);
}	

例子:统计各省份人数

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
北京省 学生人数:1

5.summarizing集合统计

summarizing统计

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值