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}
}
有点累了,继续学习之后再补充吧。。。。。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通