【挑战学习一百天冲刺实习面试】第九天8.31:Collectors和Map

Collectors

Collectors是一个工具类,是JDK预实现Collector的工具类,它内部提供了多种Collector,我们可以直接拿来使用,非常方便。

它提供了许多操作,让我们调用起来十分方便,例如:

  • toCollection:将流中的元素全部放置到一个集合中返回,这里使用Collection,泛指多种集合。
  • toList/toSet:流中的元素放置到一个列表集合/无序集set中去,默认为ArrayList和HashSet。
  • joining:将流中的元素全部以字符序列的方式连接到一起,可以指定连接符和结果的前后缀
  • mapping:对流中的每个元素进行映射,即类型转换,然后再将新元素以给定的Collector进行归纳
  • collectingAndThen:该方法是在归纳动作结束之后,对归纳的结果进行再处理
  • counting:该方法用于计数
  • minBy/maxBy:生成一个用于获取最小/最大值的Optional结果的Collector
  • summingInt/summingLong/summingDouble:生成一个用于求元素和的Collector,首先通过给定的mapper将元素转换类型,然后再求和
  • averagingInt/averagingLong/averagingDouble:生成一个用于求元素平均值的Collector,首选通过参数将元素转换为指定的类型。求平均值涉及到除法操作,结果一律为Double类型。
  • reducing:reducing方法有三个重载方法,其实是和Stream里的三个reduce方法对应的,二者是可以替换使用的,作用完全一致,也是对流中的元素做统计归纳作用。
  • groupingBy:这个方法是用于生成一个拥有分组功能的Collector,它也有三个重载方法
  • partitioningBy:将流中的元素按照给定的校验规则的结果分为两个部分,放到一个map中返回,map的键是Boolean类型,值为元素的列表List
  • toMap:根据给定的键生成器和值生成器生成的键和值保存到一个map中返回,键和值的生成都依赖于元素,可以指定出现重复键时的处理方案和保存结果的map。
  • summarizingInt/summarizingLong/summarizingDouble:这三个方法适用于汇总的,返回值分别是IntSummaryStatistics,LongSummaryStatistics,DoubleSummaryStatistics。在这些返回值中包含有流中元素的指定结果的数量、和、最大值、最小值、平均值。所有仅仅针对数值结果。
class Person {
    String name;
    String sex;
    Integer serlary;
    public Person(String name, String sex, Integer serlary) {
        this.name = name;
        this.sex = sex;
        this.serlary = serlary;
    }
}
public class Demo {
    public static void main(String[] args) {
        ArrayList<Person> list = new ArrayList<>();
        list.add(new Person("小红","女",1000));
        list.add(new Person("小芳","女",2000));
        list.add(new Person("小张","男",3000));
        list.add(new Person("小王","男",4000));
        Map<String, List<Person>> collect = list.stream().collect(Collectors.groupingBy(p -> p.sex));
        collect.forEach((k,v)-> {
            System.out.println(k);
            v.stream().forEach(p-> System.out.println(p.name));
        });
    }
}

https://www.jianshu.com/p/7eaa0969b424

Map

正如前面已经提到的那样,map是不支持流操作的。而更新后的map现在则支持多种实用的新方法,来完成常规的任务。

public class Demo {
    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>();
        for (int i = 0; i < 10; i++) {
            map.putIfAbsent(i, "val" + i);
        }
        
        //循环遍历打印,如果lambda只写一个参数默认为key
        map.forEach((id, val) -> System.out.println(val));
        
        //对 hashMap 中指定 key 的值进行重新计算,前提是该 key 存在于 hashMap 中
        //如果重新计算的值为null则自动剔除
        map.computeIfPresent(3, (num, val) -> val + num);//val3->val33
        map.computeIfPresent(9, (num, val) -> null);//val9->删除
        
        //对 hashMap 中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 hasMap 中,如果存在则不进行操作
        map.computeIfAbsent(23, num -> "val" + num);//无->val23
        map.computeIfAbsent(3, num -> "bam"+num);//val33->val33

        //删除指定k、v,如果v和写的不一样就不会删除
        map.remove(3, "val3");
        System.out.println(map.get(3));
        map.remove(3, "val33");
        System.out.println(map.get(3));

        //如果有就获取,没有就返回默认值
        System.out.println(map.getOrDefault(42, "not found"));

        //合并数据,会先判断指定的 key 是否存在,如果不存在,则添加键值对到 hashMap 中,如果存在就进行操作。
        map.merge(9, "val9", (value, newValue) -> value.concat(newValue));
        map.merge(9, "concat", (value, newValue) -> value.concat(newValue));
    }
}

好吧我承认今天偷懒了…明天写写实践报告,然后看尚硅谷的Java面试题第一季

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笼中小夜莺

嘿嘿嘿,请用金钱尽情地蹂躏我吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值