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遍历处理的更多相关文章

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

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

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

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

  3. java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合

    java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...

  4. Java8 新特性学习 Lambda表达式 和 Stream 用法案例

    Java8 新特性学习 Lambda表达式 和 Stream 用法案例 学习参考文章: https://www.cnblogs.com/coprince/p/8692972.html 1.使用lamb ...

  5. 夯实Java基础(二十二)——Java8新特性之Lambda表达式

    1.前言 Java 8于14年发布到现在已经有5年时间了,经过时间的磨练,毫无疑问,Java 8是继Java 5(发布于2004年)之后的又一个非常最重要的版本.因为Java 8里面出现了非常多新的特 ...

  6. 【Java8新特性】你知道Java8为什么要引入Lambda表达式吗?

    写在前面 这是一道真实的面试题,一个读者朋友出去面试,面试官竟然问他这样一个问题:你说说Java8中为什么引入Lambda表达式?引入Lambda表达式后有哪些好处呢?还好这个朋友对Java8早有准备 ...

  7. 【Java8新特性】- Lambda表达式

    Java8新特性 - Lambda表达式 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! ...

  8. 再来看看Java8的新特征——lambda表达式

    什么是lambda表达式? 可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表.函数主体.返回类型,可能还有一个可以抛出的异常列表. 比如说new一个Thr ...

  9. Java8新特性之Lambda表达式

    lambda表达式是java8给我们带来的几个重量级新特性之一,借用lambda表达式,可以让我们的java程序设计更加简洁.最近新的项目摒弃了1.6的版本,全面基于java8进行开发,本文是java ...

  10. Java8特性详解 lambda表达式 Stream

    1.lambda表达式 Java8最值得学习的特性就是Lambda表达式和Stream API,如果有python或者javascript的语言基础,对理解Lambda表达式有很大帮助,因为Java正 ...

随机推荐

  1. 从URL中获取参数

    1.跳转测试页面  获取的url上的参数    <!doctype html> <html lang="en"> <head>     < ...

  2. kiaba启动报 FATAL ResponseError: access_control_exception,ES报:java.lang.SecurityException: access denied ("java.io.FilePermission"“文件地址”)

    查了许多博客,找的头都大了还是没有发现问题的根源,之前以为是插件包文件名改了之后还是一样,当我差点放弃的时候 一位博主的瞬间把我点醒https://www.cnblogs.com/personblog ...

  3. leecode 19 快慢指针

    记录leecode刷题思路 19. 删除链表的倒数第 N 个结点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 示例 1: 输入:head = [1,2,3,4,5], n = ...

  4. js 比较两个数组对象,取不同的值

    let array1 = [ {'Num': 'A ', 'Name': 't1 '}, {'Num': 'B', 'Name': 't2'}, {'Num': 'C ', 'Name': 't3 ' ...

  5. cam对象类型

    //此函数的功能是打印当前坐标系试图的所有坐标系名称 static void geom_list_name(tag_t group_tag) { //ask_member_list int count ...

  6. Authentication is required to set the network proxy

    在使用VNC访问集群的时候,总是弹出"Authentication is required to set the network proxy used for downloading pac ...

  7. C# 俩个字符串数据进行对比取出不同的数据

    string sel_JD = "电冰箱,电热水壶,客厅空调,饮水机,"; string Operation_JD = "电冰箱,电热水壶,电动汽车,"; Li ...

  8. MFC学习记录2

    一.建立基于对话框工程,改变UI对象 1.改变菜单.工具栏 在资源栏中编辑菜单.工具栏,注意ID 编辑ID [Pen/Thick Line] ID : ID_PEN_THICK_OR_THIN pro ...

  9. JDBC——连接SQL Server环境配置

    JDBC:使用JAVA语言操作关系型数据库的API.是一套标准的接口. 步骤 1.创建工程,导入驱动jar包 2.注册驱动:Class.forName("com.mysql.jdbc.Dri ...

  10. #PHP #MySQL数据操作 #在线聊天 PHP实现在线聊天与MySQL的“增查删改”

    目录 1.目标图 2.项目简介 3.目录结构 4.建立MySQL表 5.实现过程 5.1 index.php 5.2 data.php 5.2 method.php 5.3  case.php 5.4 ...