java8利用流和lambda表达式对list遍历处理
java8的lambda表达式提供了一些方便list操作的方法,主要涵盖分组、过滤、求和、最值、排序、去重。
优点: (1) 简洁,跟之前的传统写法对比,能少写不少代码;
(2) 易并行计算。尤其适用于遍历结果,循环计算数值或者赋值的时候非常方便。
缺点:(1) debug调试不方便;
(2) 在非并行时,效率并没有提高(未测试)
使用总结
1.forEach()
list.forEach(item->{
//执行逻辑
//item.setName("测试");
//item.getName();
});
2.stream()流操作
2.1 去重 关键字:distinct
list = list.stream().distinct().collect(Collectors.toList());
2.2 排序 根据对象的某个属性排序 关键字:sorted
list = list.stream().sorted(((o1, o2) -> o2.getId()-o1.getId())).collect(Collectors.toList());
简化版: list.sort(((o1, o2) -> {return o2.getId()-o1.getId();}));
多字段排序: list.sort(Comparator.comparing(User::getId).thenComparing(User::getAge));
说明: o2.getId()-o1.getId()的o2和o1的顺序决定升序或是降序
2.3 过滤 根据对象的某个属性过滤 关键字:filter
list = list.stream().filter(item->item.getId()>5).collect(Collectors.toList());
2.4 提取 取出对象的某个属性的集合 关键字:map
List<Integer> idList = list.stream().map(user-> user.getId()).collect(Collectors.toList());
List<Integer> idList = list.stream().map(User::getId).collect(Collectors.toList());
说明:提取有两种写法 ,第一种是Function表达式,可以加自己的判断
2.5 统计 获取对象某个属性的平均值 最大最小值登等 关键字: mapToDouble() mapToInt() mapToLong() average max min sum
num = list.stream().mapToInt(item -> item.getId()).average();
num = list.stream().mapToInt(item -> item.getId()).max();
num = list.stream().mapToInt(item -> item.getId()).min();
大数据计算: BigDecimal num= list.stream().map(User::getNum).reduce(BigDecimal.ZERO, BigDecimal::add); 说明: 需要注意null的情况,需要先过滤,或者重写方法
若要获取最值对应的对象:
Comparator<User> comparator = Comparator.comparing(item -> item.getId);
User user = list.stream().max(comparator).get();
2.6 分组 根据对象的某个属性分组 关键字:Collectors.groupingBy
list.stream().collect(Collectors.groupingBy(item -> item.getId()));
说明: 还可以多重分组或者是多字段分组或者是统计分组后的某个属性的最大最小值等 关键字:Collectors.summarizingInt
2.7 转map
Map map = list.stream().collect(Collectors.toMap(item -> item.getId(),a -> a,(k1,k2)->k1));
说明:当key重复时会报错,所以需要加上 (k1,k2)->k1),表示有重复时,取k1的值
java8利用流和lambda表达式对list遍历处理的更多相关文章
- Java8新特性 1——利用流和Lambda表达式操作集合
Java8中可以用简洁的代码来操作集合,比如List,Map,他们的实现ArrayList.以此来实现Java8的充分利用CPU的目标. 流和Lambda表达式都是Java8中的新特性.流可以实现对集 ...
- Java8新特性 利用流和Lambda表达式对List集合进行处理
Lambda表达式处理List 最近在做项目的过程中经常会接触到 lambda 表达式,随后发现它基本上可以替代所有 for 循环,包括增强for循环.也就是我认为,绝大部分的for循环都可以用 la ...
- java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合
java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...
- Java8 新特性学习 Lambda表达式 和 Stream 用法案例
Java8 新特性学习 Lambda表达式 和 Stream 用法案例 学习参考文章: https://www.cnblogs.com/coprince/p/8692972.html 1.使用lamb ...
- 夯实Java基础(二十二)——Java8新特性之Lambda表达式
1.前言 Java 8于14年发布到现在已经有5年时间了,经过时间的磨练,毫无疑问,Java 8是继Java 5(发布于2004年)之后的又一个非常最重要的版本.因为Java 8里面出现了非常多新的特 ...
- 【Java8新特性】你知道Java8为什么要引入Lambda表达式吗?
写在前面 这是一道真实的面试题,一个读者朋友出去面试,面试官竟然问他这样一个问题:你说说Java8中为什么引入Lambda表达式?引入Lambda表达式后有哪些好处呢?还好这个朋友对Java8早有准备 ...
- 【Java8新特性】- Lambda表达式
Java8新特性 - Lambda表达式 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! ...
- 再来看看Java8的新特征——lambda表达式
什么是lambda表达式? 可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表.函数主体.返回类型,可能还有一个可以抛出的异常列表. 比如说new一个Thr ...
- Java8新特性之Lambda表达式
lambda表达式是java8给我们带来的几个重量级新特性之一,借用lambda表达式,可以让我们的java程序设计更加简洁.最近新的项目摒弃了1.6的版本,全面基于java8进行开发,本文是java ...
- Java8特性详解 lambda表达式 Stream
1.lambda表达式 Java8最值得学习的特性就是Lambda表达式和Stream API,如果有python或者javascript的语言基础,对理解Lambda表达式有很大帮助,因为Java正 ...
随机推荐
- Vue3.0 编译做了哪些优化
a. 生成 Block tree Vue.js 2.x 的数据更新并触发重新渲染的粒度是组件级的,单个组件内部 需要遍历该组 件的整个 vnode 树.在 2.0 里,渲染效率的快慢与组件大小成正相关 ...
- promethus+grafana监控
1.监控 MySQL (终端可以安装在任意主机,不一定按在mysql节点上,注:mysql版本需在5.5以上) I.首先在mysql中添加监控使用的用户: create user 'exp'@'%' ...
- python import导入失败 相对路径 绝对路径
首先我们有这样一个目录结构 经过我无数次的调试,我发现从test3调用spider以及downloadss文件可以直接import调用 但是从外部的app.py文件调用,spider.py文件死活调用 ...
- 替代学习物联网-云服务-02阿里云MQTT
1.支付宝登录,进入物联网平台 https://iot.console.aliyun.com/product 2.新建产品 3.添加设备 4.设备连接参数 5.连接到阿里云
- 在安装SDK8.1和Visual Studio 2017时,提示“已停止工作”
解决办法:在微软官网下载 .net framework 的最新的开发包(Build apps - Dev Pack),重新安装后问题得到解决. https://dotnet.microsoft.com ...
- python学习笔记-简介
python简介 python是一种简单易学,功能强大的编程语言,他有高效的高层数据结构,简单而有效的实现面向对象编程.python是一种解释性语言,在多数平台的多个领域都是理想的脚本语言,特别适用于 ...
- Doris与mysql语法对照,差异篇
## SQL语法差异:### doris中不支持分组列再使用distinctMSYQL:```SQLselect DISTINCT mid from order_card_detail GROUP B ...
- keras构建1D-CNN模型
接触过深度学习的人一定听过keras,为了学习的方便,接下来将要仔细的讲解一下这keras库是如何构建1D-CNN深度学习框架的 from keras.datasets import imdb fro ...
- WPF VB.NET 代码实现界面动画效果
WPF VB.NET 代码实现界面动画效果 Imports System.Windows.Media.Animation 例子: Dim result As New Storyboard Dim an ...
- Windows修改用户名
修改用户名 右键此电脑>>管理>>本地用户和组>>用户,找到要修改的用户,重命名 修改用户home目录名 1.激活管理员账号 右键此电脑>>管理> ...