JDK8:Lambda表达式操作List集合
JDK8的流对list的处理提供了很大的方便,特别是做报表的时候才能真正体现出来这个功能的强大;结合日常使用过程,有两个体会:一个是减少了数据库连接,最忌讳在循环中进行数据查询,特别是嵌套多层循环的时候;在循环中查表,严重影响整体性能;采用JDK8以后可以将所需的全部数据查询出来,然后通过流很方便的就过滤出想要的数据;二是减少了for循环以及多重的for循环。
新建所需的实体类:LambdaFirstDemo 包含演示所有的字段信息
@Data
@NoArgsConstructor
@AllArgsConstructor
public class LambdaFirstDemo {
/**
*用户名称
*/
private String userName;
/**
*年龄
*/
private Integer age;
/**
*性别
*/
private String sex;
}
新建所需的实体类:LambdaFirstDemo 包含演示所有的字段信息
@Data
@Accessors(fluent = true)
@NoArgsConstructor
@AllArgsConstructor
public class LambdaSecondDemo {
/**
*用户名称
*/
private String userName;
/**
*年龄
*/
private Integer age;
}
结合项目研发过程中对List集合的使用情况,主要存在以下使用场景:
1、快速的遍历List集合
2、获取List集合的某些字段,然后重新生成新的List集合
3、根据某些条件对List集合进行过滤处理,并将符合条件的数据存入另一个List集合
4、根据某个属性或多个属性对List集合中的数据进行排序操作
5、根据某个属性或多个属性对List集合进行分组操作
6、从List集合中提取某一个属性信息,并生成新的List
@Slf4j
public class LambdaDemoTest {
public static void main(String[] args) {
// 准备各类演示数据
List<LambdaFirstDemo> demoList = new ArrayList<>();
LambdaFirstDemo lambdaFirstDemo1 = new LambdaFirstDemo("张三", 13, "男");
LambdaFirstDemo lambdaFirstDemo2 = new LambdaFirstDemo("李四", 23, "男");
LambdaFirstDemo lambdaFirstDemo3 = new LambdaFirstDemo("王五", 34, "女");
LambdaFirstDemo lambdaFirstDemo4 = new LambdaFirstDemo("李一", 43 , "男");
LambdaFirstDemo lambdaFirstDemo5 = new LambdaFirstDemo("古斯", 25, "女");
LambdaFirstDemo lambdaFirstDemo6 = new LambdaFirstDemo("三狗", 43, "男");
LambdaFirstDemo lambdaFirstDemo7 = new LambdaFirstDemo("二蛋", 23, "男");
demoList.add(lambdaFirstDemo1);
demoList.add(lambdaFirstDemo2);
demoList.add(lambdaFirstDemo3);
demoList.add(lambdaFirstDemo4);
demoList.add(lambdaFirstDemo5);
demoList.add(lambdaFirstDemo6);
demoList.add(lambdaFirstDemo7);
/**
*1、获取list某些字段,然后重新组装list并遍历
*/
List<LambdaSecondDemo> lambdaSecondDemoList;
lambdaSecondDemoList = demoList.stream().map(lambdaFirstDemo -> new LambdaSecondDemo(lambdaFirstDemo.getUserName(), lambdaFirstDemo.getAge())).collect(Collectors.toList());
lambdaSecondDemoList.forEach(lambdaSecondDemo -> log.info("用户名称:{},年龄:{}", lambdaSecondDemo.userName(), lambdaSecondDemo.age()));
/**
* 2、利用stream().filter()对List进行过滤处理,并将符合条件的数据给另一个list赋值,最后对其进行遍历
*/
List<LambdaFirstDemo> manLambdaFirstDemoList;
manLambdaFirstDemoList = demoList.stream().filter(lambdaFirstDemo -> "男".equals(lambdaFirstDemo.getSex())).collect(Collectors.toList());
manLambdaFirstDemoList.forEach(lambdaFirstDemo -> log.info("用户名称:{},年龄:{},性别:{}", lambdaFirstDemo.getUserName(), lambdaFirstDemo.getAge(), lambdaFirstDemo.getSex()));
/**
* 3、通过Sort方法可对集合中的单字段、多字段进行排序(正序、倒序)操作
*/
List<LambdaFirstDemo> sortSimpleLambdaFirstDemoList;
// 单字段正序
sortSimpleLambdaFirstDemoList = demoList.stream().sorted(Comparator.comparing(LambdaFirstDemo::getAge)).collect(Collectors.toList());
sortSimpleLambdaFirstDemoList.forEach(sortLambdaFirstDemo -> log.info("年龄(正序):{}", sortLambdaFirstDemo.getAge()));
// 单字段倒序
sortSimpleLambdaFirstDemoList = demoList.stream().sorted(Comparator.comparing(LambdaFirstDemo::getAge).reversed()).collect(Collectors.toList());
sortSimpleLambdaFirstDemoList.forEach(sortLambdaFirstDemo -> log.info("年龄(倒序):{}", sortLambdaFirstDemo.getAge()));
// 多条件正序
List<LambdaFirstDemo> sortMultiLambdaFirstDemoList;
sortMultiLambdaFirstDemoList = demoList.stream().sorted(Comparator.comparing(LambdaFirstDemo::getAge).thenComparing(LambdaFirstDemo::getUserName).reversed()).collect(Collectors.toList());
sortMultiLambdaFirstDemoList.forEach(sortLambdaFirstDemo -> log.info("年龄:{},用户名称:{}", sortLambdaFirstDemo.getAge(),sortLambdaFirstDemo.getUserName()));
/**
* 4、通过groupingBy根据制定字段进行分组操作
*/
// 按照年龄分组
Map<Integer, List<LambdaFirstDemo>> listMap = demoList.stream().collect(Collectors.groupingBy(LambdaFirstDemo::getAge));
System.out.println(listMap);
// 先按照性别分组再按照年龄分组
//Map<String/*性别id*/, Map<Integer/*年龄id*/, List<LambdaFirstDemo>>>
Map<String, Map<Integer, List<LambdaFirstDemo>>> groupMap = demoList.stream().collect(Collectors.groupingBy(LambdaFirstDemo::getSex, Collectors.groupingBy(LambdaFirstDemo::getAge)));
System.out.println("按照性别再按年龄分组:"+groupMap);
/**
* 5、提取对象中的某一元素,例子中计划取的是每个人的userName,注意list中类型对应,如果取的是age,就应该是integer类型
*/
List<String> mapList = demoList.stream().map(LambdaFirstDemo::getUserName).collect(Collectors.toList());
System.out.println("提取后:"+mapList);
}
JDK8:Lambda表达式操作List集合的更多相关文章
- 用Lambda表达式操作List集合
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- java使用lambda表达式对List集合进行操作(JDK1.8)
1. 使用lambda表达式对List集合进行操作(JDK1.) List<TreeDto> collect = list.stream().filter(item -> item. ...
- jdk8 lambda表达式总结
Java8 lambda表达式10个示例 1. 实现Runnable线程案例 使用() -> {} 替代匿名类: //Before Java 8: new Thread(new Runnab ...
- jdk8 Lambda表达式与匿名内部类比较
Labmda表达式与匿名内部类 前言 Java Labmda表达式的一个重要用法是简化某些匿名内部类(Anonymous Classes)的写法.实际上Lambda表达式并不仅仅是匿名内部类的语法糖, ...
- Java8新特性 1——利用流和Lambda表达式操作集合
Java8中可以用简洁的代码来操作集合,比如List,Map,他们的实现ArrayList.以此来实现Java8的充分利用CPU的目标. 流和Lambda表达式都是Java8中的新特性.流可以实现对集 ...
- Lambda表达式和Java集合框架
本文github地址 前言 我们先从最熟悉的Java集合框架(Java Collections Framework, JCF)开始说起. 为引入Lambda表达式,Java8新增了java.util. ...
- Java8新特性 利用流和Lambda表达式对List集合进行处理
Lambda表达式处理List 最近在做项目的过程中经常会接触到 lambda 表达式,随后发现它基本上可以替代所有 for 循环,包括增强for循环.也就是我认为,绝大部分的for循环都可以用 la ...
- JDK8 Lambda表达式对代码的简化
只是举个例子: public class LambdaDemo { public static String findData( String name , LambdaInterface finde ...
- lambda表达式操作DataTable番外篇
using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Text; ...
- java lambda表达式检查list集合是否存在某个值
import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class ...
随机推荐
- beforeRouteLeave vue监听返回的使用方法
beforeRouteLeave(to, from, next) { console.log(this, to, from, next, "thissss"); if (to.fu ...
- css内容超出元素高度可滚动并且隐藏滚动条
.div::-webkit-scrollbar { display: none; / Chrome Safari / } .div{ scrollbar-width: none; / firefox ...
- Safari高级使用
Safari是苹果公司为旗下设备开发的一款强大的浏览器不论是iPhone还是iPad亦或是MAC OS上都能使用.但是针对不同的系统,Safari也有一定的改动.那么在MacOS中如何使用Safari ...
- Ubuntu 20.04 部署Prmoetheus+grafana+mysql+mysqld_exporter+node_exporter
Prometheus简介 Prometheus是一个功能强大的开源监控系统,可从您的服务中收集指标并将其存储在时间序列数据库中.它通过Grafana等工具提供多维数据模型,灵活的查询语言和多样化的可视 ...
- 本地jar包怎么导入到maven仓库中?
1.找到你所需要的jar包 2.打开cmd找到jar包的文件夹下 3.输入安装命令实例命令 1 安装指定文件到本地仓库命令:mvn install:install-file 2 -DgroupId=& ...
- 在Unity3D中开发的Dissolve Shader
Swordmaster Dissolve Shaders 特点 本插件共包含两种Dissolve Shader: (1).一种类型是Bumped Specular工作流的Dissolve Shader ...
- win10下 pytorch 跑模型 gpu利用率低
查阅资料后发现 Dataloader中的num_workers参数(线程数)设置为0,该为4后,nvidia-smi查看GPU占用率变为高(不要用任务管理器查看)
- docker-compose实践(携程apollo项目)
docker-compose使用开源镜像启动容器 以携程apollo项目为例,使用docker-compose部署单节点模式 创建apollo文件夹,vim一个新的docker-compose.yam ...
- python Elementtree 生成带缩进格式的xml文件
示例 之前拿ET写xml,直接对root节点调用write函数,会出现产生的xml字符串没有缩进,是干巴巴的一行,可读性比较差,就像下面这样: <annotation><filena ...
- Oracle账户被锁住,解锁
转载自:https://blog.csdn.net/weixin_43464743/article/details/121226334 方法一PLSQL解锁1.用dba用户登录plsql.2.左侧选择 ...