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面试题第一季