java8中流式方法总结

前段时间太忙了,没法静下心来写一些总结。不说废话,先抛出这次总结的主题————java8


 

这个名词一定不会陌生,在学校里的时候总会被要求安装jdk1.8的java环境。装大家都装过,在java8的基础上引用各种各样的依赖,使用各种各样的工具类,相信大家都会。可是引得依赖,工具类多了,项目就会变得非常庞大,这时,我发现我们忽视了java8新增的很多优秀的特性,比方说:Lambda表达式Stream API,今天我就来浅浅总结一些我用过的,好用的Stream API的使用方法。(后续会继续学习并分享java8的各种优秀特性)

 


1.筛选出年龄大于26岁的员工

List<Worker> list = new ArrayList<Worker>() {
{
add(new Worker("李刚", 35, "总经理", 15000));
add(new Worker("王五", 25, "工人", 3500));
add(new Worker("刘三", 27, "组长", 5500));
add(new Worker("张四", 29, "主管", 9500));
}
};
list = list.stream().filter(e -> e.getAge() > 26).collect(Collectors.toList());

运行结果:[{"age":35,"department":"总经理","name":"李刚","salary":15000},{"age":27,"department":"组长","name":"刘三","salary":5500},{"age":29,"department":"主管","name":"张四","salary":9500}]

2.筛选出年龄大于26岁的员工并按照年龄从小到大排序

list = list.stream().filter(e -> e.getAge() > 26).sorted(Comparator.comparing(Worker::getAge)).collect(Collectors.toList());

3.筛选出年龄大于26岁的员工并按照年龄从大到小排序

list = list.stream().filter(e -> e.getAge() > 26).sorted(Comparator.comparing(Worker::getAge).reversed()).collect(Collectors.toList());

4.提取出列表中对象的某一属性

List<String> nameList = list.stream().map(Worker::getName).collect(Collectors.toList());
并去除重复名字:List<String> nameList = list.stream().map(Worker::getName).disctinct().collect(Collectors.toList());

5.计算列表某一属性的和,例如:工资总和

int salarySum = list.stream().mapToInt(Worker::getSalary).sum(); 

结果:33050

6.计算列表里符合条件的记录条数,例如年龄大于26的员工人数

long count = list.stream().filter(e -> e.getAge() > 26).count(); 

结果:3

7.分组统计统计不同年龄的员工人数

Map<Integer, List<Worker>> listByAgeGroup = list.stream().collect(Collectors.groupingBy(Worker::getAge));

运行结果:

{

  35=[Worker(name=李刚, age=35, department=总经理, salary=15000)],

  25=[Worker(name=王五, age=25, department=工人, salary=3500)],

  27=[Worker(name=刘三, age=27, department=组长, salary=5500)],

  29=[Worker(name=张四, age=29, department=主管, salary=9500)]

}

8.分组不同年龄的员工人数并按照年龄升序排序(TreeMap是有序的,如果键是数值类,默认升序,若为字符型则需要自己实现比较器)

Map<Integer, List<Worker>> listByAgeGroup = list.stream().collect(Collectors.groupingBy(Worker::getAge, TreeMap::new, Collectors.toList()));

运行结果:

{

  25=[Worker(name=王五, age=25, department=工人, salary=3500)],

  27=[Worker(name=刘三, age=27, department=组长, salary=5500)],

  29=[Worker(name=张四, age=29, department=主管, salary=9500)],

  35=[Worker(name=李刚, age=35, department=总经理, salary=15000)]

}

9.自定义排序比较器(倒序)

TreeMap<Integer, List<Worker>> listByAgeGroup = list.stream().collect(Collectors.groupingBy(Worker::getAge, () -> {
Comparator<Integer> compare = Comparator.comparing(Function.identity());
return new TreeMap<>(compare.reversed());
}, Collectors.toList()));

运行结果:

{

  35=[Worker(name=李刚, age=35, department=总经理, salary=15000)],

  29=[Worker(name=张四, age=29, department=主管, salary=9500)],

  27=[Worker(name=刘三, age=27, department=组长, salary=5500)],

  25=[Worker(name=王五, age=25, department=工人, salary=3500)]

}

10.排序后统计每组的记录数量,工资的总和,平均值,最大,最小值

TreeMap<Integer, IntSummaryStatistics> statisticsByAgeGroup = list.stream().collect(Collectors.groupingBy(Worker::getAge, () -> {
Comparator<Integer> compare = Comparator.comparing(Function.identity());
return new TreeMap<>(compare.reversed());
}, Collectors.summarizingInt(Worker::getSalary)));

运行结果:

{

  35=IntSummaryStatistics{count=1, sum=15000, min=15000, average=15000.000000, max=15000},

  34=IntSummaryStatistics{count=1, sum=13000, min=13000, average=13000.000000, max=13000},

  29=IntSummaryStatistics{count=2, sum=17000, min=7500, average=8500.000000, max=9500},

  27=IntSummaryStatistics{count=1, sum=5500, min=5500, average=5500.000000, max=5500},

  25=IntSummaryStatistics{count=3, sum=11500, min=3500, average=3833.333333, max=4500}

}

 

有点累了,继续学习之后再补充吧。。。。。。


 


posted @   xqy-2021  阅读(117)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示