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集合的更多相关文章

  1. 用Lambda表达式操作List集合

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  2. java使用lambda表达式对List集合进行操作(JDK1.8)

    1. 使用lambda表达式对List集合进行操作(JDK1.) List<TreeDto> collect = list.stream().filter(item -> item. ...

  3. jdk8 lambda表达式总结

    Java8 lambda表达式10个示例   1. 实现Runnable线程案例 使用() -> {} 替代匿名类: //Before Java 8: new Thread(new Runnab ...

  4. jdk8 Lambda表达式与匿名内部类比较

    Labmda表达式与匿名内部类 前言 Java Labmda表达式的一个重要用法是简化某些匿名内部类(Anonymous Classes)的写法.实际上Lambda表达式并不仅仅是匿名内部类的语法糖, ...

  5. Java8新特性 1——利用流和Lambda表达式操作集合

    Java8中可以用简洁的代码来操作集合,比如List,Map,他们的实现ArrayList.以此来实现Java8的充分利用CPU的目标. 流和Lambda表达式都是Java8中的新特性.流可以实现对集 ...

  6. Lambda表达式和Java集合框架

    本文github地址 前言 我们先从最熟悉的Java集合框架(Java Collections Framework, JCF)开始说起. 为引入Lambda表达式,Java8新增了java.util. ...

  7. Java8新特性 利用流和Lambda表达式对List集合进行处理

    Lambda表达式处理List 最近在做项目的过程中经常会接触到 lambda 表达式,随后发现它基本上可以替代所有 for 循环,包括增强for循环.也就是我认为,绝大部分的for循环都可以用 la ...

  8. JDK8 Lambda表达式对代码的简化

    只是举个例子: public class LambdaDemo { public static String findData( String name , LambdaInterface finde ...

  9. lambda表达式操作DataTable番外篇

    using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Text; ...

  10. java lambda表达式检查list集合是否存在某个值

    import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class ...

随机推荐

  1. 启动 RMAN 客户端并与之交互

    启动和退出 RMAN RMAN 可执行文件与数据库一起自动安装,通常与其他数据库可执行文件位于同一目录中.例如,Linux 上的 RMAN 客户端位于$ORACLE_HOME/bin. 您有以下启动 ...

  2. Linux-centos7 下开放某个端口

    方式一 1.开启防火墙 systemctl start firewalld  2.开放指定端口 firewall-cmd --zone=public --add-port=1935/tcp --per ...

  3. Flask的介绍、安装和使用

    Flask的介绍 Flask其实就是Python-web中的一个框架,也就是说Flask是一个工具,提供了库和技术来让你建立一个web的应用程序.这个程序可以使一些web页面.博客.基于web的日历应 ...

  4. Spring RMI 介绍

    Spring RMI RMI全称是Remote Method Invocation-远程方法调用,是纯Java的网络分布式应用系统的核心解决方案之一.Java RMI 支持存储于不同地址空间的程序级对 ...

  5. 关于JDK1.8 java HashMap的tableSizeFor的解析:一个数最近2的幂次数方法

    简介 一个数的最近2的幂次数,是java hashmap初始化方法指定容量里面对容量进行处理采用的方法 1.位运算符号介绍 符号 描述 运算规则 & 与 两个位都为1时,结果才为1 | 或 两 ...

  6. 2022-07-09 第一小组 张明旭 前端HTML学习记录

    今天是正式学习的第一天,第一次接触前端内容,蒙了一圈又一圈,老师讲课速度是1000圈/s!!!!!!(插一句老师的打字和打代码速度起飞!) 好在有视频回放而且跟了笔记,能复习n遍.加油!!! 主要学习 ...

  7. python基础篇 12-函数+文件读写+json练习作业

    需求: 写一个管理商品的程序,商品文件格式在a.json里面 提供商品的增删改查功能 choice = input('请输入你的选择:1.查看商品 2.新增商品 3.修改商品 4.删除商品') #1. ...

  8. django前后端分离接口开发

    用django进行接口开发 接口: /api/parameter (同一个接口地址实现不同的请求方式) 全局参数(get,post,put,delete) GET:获取全局参数的所有数据 POST:创 ...

  9. 使用IScroll组件出现滑动卡顿问题解决方法

    var is = new IScroll('#wrapper2', { scrollX: true, scrollY: false, click: true, keyBindings: true, / ...

  10. defer、panic、recover

    defer(延迟执行语句) 多个延迟执行语句的处理顺序 package main import ( "fmt" ) func main() { fmt.Println(" ...