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. openstack 下云主机所在目录

    1.先查看云主机运行在哪个节点 2. [root@compute01 ~]# cd /var/lib/nova/instances/ 注: 云主机是一台链接克隆的虚拟机,_base 是母盘, fa56 ...

  2. vim ctrl+s 不能再操作

    vim下编写代码不自觉按到Ctrl+S,此时vim就不能再操作了.发现vim下Ctrl+S是阻止之后的输入,可通过Ctrl+Q来解除.

  3. vue 在 v-for 时给每项元素绑定事件需要用事件代理吗?为什么?

    vue本身不做事件代理(react将所有事件都委托到document上,然后进行派发) 普通html元素和在组件上挂了.native修饰符的事件.最终EventTarget.addEventListe ...

  4. bigdecimal 比较大小、bigdecimal 数学运算、bigdecimal 精度

    创建 BigDecimal 建议使用 public BigDecimal(String val),使用 number 参数可能会有精度问题 设置精度 setScale(3, BigDecimal.RO ...

  5. Unity生成AB包和加载AB包

    unity生成AB包 生产AB包,编辑器脚本放在Editor文件夹下(切记) 如果你是PC包 BuildTarget.WebGL  后面要改成PC (BuildTarget.StandaloneWin ...

  6. java redis 获取key 剩余时间

    /** * 查询key的生命周期 * @param key redis 存数据的键 * @return 默认单位秒,也可以自行传入单位 */public long getKeyExpire(Strin ...

  7. 数据库负载均衡 happroxy 中间器(Nginx)容器的安装与配置

    docker  镜像中安装haproxy 1.下载并安装haproxy镜像 docker pull happroxy # docker pull haproxy:1.7 2.查看镜像 docker i ...

  8. WEB攻击与防御技术 pikachu——文件包含下载上传漏洞

    文件包含漏洞 一.LOCAL 上来就是一个选择,当我们选择一个球员的时候,如图所示,url会提交一个get请求 如果这个服务器架设在linux上我们就可以一直../../../../../到根目录然后 ...

  9. Leetcode457

    A very absurd description for this problem, but people can get the idea by looking at the examples.. ...

  10. JavaScript常见事件记录

    JavaScript常见事件记录 onblur: 元素失去焦点 onfocus: 元素获得焦点 onchange: 用户改变域的内容 onclick: 鼠标点击某个对象 ondblclick: 鼠标双 ...