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. JS 将伪数组转换成数组

    在 JS 中,伪数组 是非常常见的,它也叫 类数组.伪数组可能会给 JS 初学者带来一点困扰. 本文将详细讲解 什么是伪数组,以及分别在 ES5 和 ES6 中将伪数组转换成真正的数组 . 什么是伪数 ...

  2. React 事件绑定this指向

    1. 推荐:使用class的实例方法 class Hello extends React.Component { handleClick = () => { this.setState({ .. ...

  3. JAVA根据时间增加1天

    String time = "2021-12-1"; //指定时间 int day = 30;//指定增加天数 SimpleDateFormat sf = new SimpleDa ...

  4. Pytest之参数化

    在unittest测试中,有参数化的概念,那么在pytest中也有. 如何理解参数化: 当对一个测试函数进行测试时,通常会给函数传递多组参数.比如测试账号登陆,我们需要模拟各种千奇百怪的账号密码.可以 ...

  5. 链表与malloc的疑惑

    1.奇怪点:如果我只是需要一个结点的空间为什么malloc的转换形式写成--Node=(int *)malloc(sizeof(int)) 自我解答:void *malloc(unsigned int ...

  6. ssh scp 相关

    1. 设置ssh 的免密登录 1> 将 ~/.ssh/id_rsa.pub文件中的内容拷贝到 远程host的 ~/.ssh/authorized_keys文件中 2> ssh-copy-i ...

  7. 前端入门知识点笔记本之js重定位函数

    1. call().bind().apply()的用法,改变this的指向,区别在于f.call(obj, arg1, arg2...),f.bind(obj, arg1, arg2,...)(),f ...

  8. CSS手册

    3. CSS背景 1. 颜色 body {background-color:#b0c4de;} 十六进制 - 如:"#ff0000" RGB - 如:"rgb(255,0 ...

  9. 关于uniapp的事件监听,使用uni.$once和uni.$on导致的重复监听

    最近写项目的时候遇到个问题,就是在使用uniapp的事件监听器时出现重复监听问题.一开始我是用的uni.$on去监听事件,然后出现了重复的触发监听.百度了下,官方提示单次触发的建议使用uni.$onc ...

  10. 搭建CosId服务

    CosId介绍 CosId 旨在提供通用.灵活.高性能的分布式 ID 生成器.项目中还是很好集成,CosId本身采用spring boot与spring cloud框架,如果项目是这类的微服务框架,那 ...