利用java8新特性,可以用简洁高效的代码来实现一些数据处理。

定义1个Apple对象:

 public class Apple {private Integer id;private String name;private BigDecimal money;private Integer num;public Apple(Integer id, String name, BigDecimal money, Integer num) {this.id = id;this.name = name;this.money = money;this.num = num;}}

添加一些测试数据:


List<Apple> appleList = new ArrayList<>();//存放apple对象集合Apple apple1 =  new Apple(1,"苹果1",new BigDecimal("3.25"),10);
Apple apple12 = new Apple(1,"苹果2",new BigDecimal("1.35"),20);
Apple apple2 =  new Apple(2,"香蕉",new BigDecimal("2.89"),30);
Apple apple3 =  new Apple(3,"荔枝",new BigDecimal("9.99"),40);appleList.add(apple1);
appleList.add(apple12);
appleList.add(apple2);
appleList.add(apple3);

1、分组
List里面的对象元素,以某个属性来分组,例如,以id分组,将id相同的放在一起:

//List 以ID分组 Map<Integer,List<Apple>>
Map<Integer, List<Apple>> groupBy = appleList.stream().collect(Collectors.groupingBy(Apple::getId));System.err.println("groupBy:"+groupBy);
{1=[Apple{id=1, name='苹果1', money=3.25, num=10},Apple{id=1, name='苹果2', money=1.35, num=20}], 2=[Apple{id=2, name='香蕉', money=2.89, num=30}],3=[Apple{id=3, name='荔枝', money=9.99, num=40}]}

2、List转Map
id为key,apple对象为value,可以这么做:

/*** List -> Map* 需要注意的是:* toMap 如果集合对象有重复的key,会报错Duplicate key ....*  apple1,apple12的id都为1。*  可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2*/
Map<Integer, Apple> appleMap = appleList.stream().collect(Collectors.toMap(Apple::getId, a -> a,(k1,k2)->k1));
打印appleMap
{1=Apple{id=1, name='苹果1', money=3.25, num=10},2=Apple{id=2, name='香蕉', money=2.89, num=30},3=Apple{id=3, name='荔枝', money=9.99, num=40}}

3、过滤Filter
从集合中过滤出来符合条件的元素:

//过滤出符合条件的数据
List<Apple> filterList = appleList.stream().filter(a -> a.getName().equals("香蕉")).collect(Collectors.toList());System.err.println("filterList:"+filterList);
[Apple{id=2, name='香蕉', money=2.89, num=30}]

4.求和
将集合中的数据按照某个属性求和:

//计算 总金额
BigDecimal totalMoney = appleList.stream().map(Apple::getMoney).reduce(BigDecimal.ZERO, BigDecimal::add);
System.err.println("totalMoney:"+totalMoney);  //totalMoney:17.48

5.查找流中最大 最小值
Collectors.maxBy 和 Collectors.minBy 来计算流中的最大或最小值。


Optional<Dish> maxDish = Dish.menu.stream().collect(Collectors.maxBy(Comparator.comparing(Dish::getCalories)));
maxDish.ifPresent(System.out::println);Optional<Dish> minDish = Dish.menu.stream().collect(Collectors.minBy(Comparator.comparing(Dish::getCalories)));
minDish.ifPresent(System.out::println);

6.去重

import static java.util.Comparator.comparingLong;
import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.toCollection;// 根据id去重List<Person> unique = appleList.stream().collect(collectingAndThen(toCollection(() -> new TreeSet<>(comparingLong(Apple::getId))), ArrayList::new));

下表展示 Collectors 类的静态工厂方法。

工厂方法 返回类型 作用
toList List 把流中所有项目收集到一个 List
toSet Set 把流中所有项目收集到一个 Set,删除重复项
toCollection Collection 把流中所有项目收集到给定的供应源创建的集合menuStream.collect(toCollection(), ArrayList::new)
counting Long 计算流中元素的个数
sumInt Integer 对流中项目的一个整数属性求和
averagingInt Double 计算流中项目 Integer 属性的平均值
summarizingInt IntSummaryStatistics 收集关于流中项目 Integer 属性的统计值,例如最大、最小、 总和与平均值
joining String 连接对流中每个项目调用 toString 方法所生成的字符串collect(joining(", "))
maxBy Optional 一个包裹了流中按照给定比较器选出的最大元素的 Optional, 或如果流为空则为 Optional.empty()
minBy Optional 一个包裹了流中按照给定比较器选出的最小元素的 Optional, 或如果流为空则为 Optional.empty()
reducing 归约操作产生的类型 从一个作为累加器的初始值开始,利用 BinaryOperator 与流 中的元素逐个结合,从而将流归约为单个值累加int totalCalories = menuStream.collect(reducing(0, Dish::getCalories, Integer::sum));
collectingAndThen 转换函数返回的类型 包裹另一个收集器,对其结果应用转换函数int howManyDishes = menuStream.collect(collectingAndThen(toList(), List::size))
groupingBy Map<K, List> 根据项目的一个属性的值对流中的项目作问组,并将属性值作 为结果 Map 的键
partitioningBy Map<Boolean,List> 根据对流中每个项目应用谓词的结果来对项目进行分区

lamda表达式对list各种处理相关推荐

  1. 委托、lamda表达式..委托概念-匿名函数-泛型委托-Lamda表达式-多播委托

    委托 一.什么是委托? 将一个方法作为参数传递给另一个方法(参数类型为委托delegate).   声明一个委托类型. 委托所指向的函数必须跟委托具有相同的的签名(参数个数.参数类型.返回值一样). ...

  2. 为了去重复,写了一个通用的比较容器类,可以用在需要比较的地方,且支持Lamda表达式...

    为了去重复,写了一个通用的比较容器类,可以用在需要比较的地方,且支持Lamda表达式,代码如下: public class DataComparer<T>:IEqualityCompare ...

  3. Java --Lamda表达式

    Lamda:属于函数式编程的概念: interface IMessage {public void print() ; } public class TestDemo {public static v ...

  4. 什么是lamda表达式?

    我们首先来看一下这一片代码: 1 class Solution { 2 public: 3 int singleNumber(int A[], int n) { 4 // Note: The Solu ...

  5. [.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用

    [.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用 本节导读:讨论了表达式树的定义和解析之后,我们知道了表达式树就是并非可执行代码,而是将表达式对象化后的数据结构.是 ...

  6. 带参的信号、lamda表达式及坐标系统

    带参的信号.lamda表达式及坐标系统 文章目录 带参的信号.lamda表达式及坐标系统 一.带参的信号 二.lamda表达式 三.坐标系统 一.带参的信号 1. 自定义信号(这个信号不像标准信号是一 ...

  7. 静态内部类、局部内部类、匿名内部类、lamda表达式

    普通的继承: 静态内部类( 必须有static修饰): 局部内部内(写在任意方法中的): 匿名内部类(可以写在任意位置): lamda表达式(感觉像匿名内部类的简化)(前题是函数式接口:接口中只有一个 ...

  8. 一个小案例精通lamda表达式与函数式接口

    前言:只有基础(多态.匿名接口实现类)足够扎实才能更好的学习花拳绣腿(lamda表达式),Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性.Lambda 允许把函数作为一 ...

  9. c++ lamda表达式调用自身实现定时器

    刚好要做一个定时器,用asio的deadline_timer,通过异步等待方式去做,超时后重新设置超时时间再重新异步等待. 将lamda表达式放到function中,异步等待的时候再调用自身. 具体代 ...

  10. [ASP.NET MVC]让Html.RenderAction支持Lamda表达式

    今天在ASP.NET MVC代码时用到了Html.RenderAction,代码如下: @{Html.RenderAction("RecentNews")} 通过字符串指定Acti ...

最新文章

  1. java rgb 黑色_Java实现图片亮度自动调节(RGB格式)
  2. angularJS在创建指令需要注意的问题(指令中使用ngRepeat)
  3. Word保存自己格式模板的方法
  4. Java常用命令及参数
  5. SOA ESB 微服务 浅析
  6. Tensorflow:tf.contrib.lookup索引构建和查询
  7. 用iostat对linux硬盘IO性能进行检测
  8. PHP在线教育直播平台源码 网课小程序源码 在线学习系统源码(PC+小程序+H5 )
  9. [我也GitHub]我很焦虑, 我很暴躁!
  10. 苹果App Store最新应用审核标准
  11. php的vget方法,ext_lanzou.php
  12. Github-Client(ANDROID)开源之旅(四) ------ 简介Roboguice
  13. 关闭删库跑路的后门,打造高可用的MySQL
  14. 机器学习——线性回归衍生(过拟合、正则化、岭回归和LASSO回归)
  15. Vivado Digilent IP核
  16. 微信小程序开发 一 tabbar图标和颜色
  17. c语言快餐店pos机计费系统,消费机,售饭机,食堂刷卡机,食堂收费机,餐饮收费POS机 -- 新开普(股票代码,300248)...
  18. cURL error 1014: SSL verify failed 报错
  19. 面向对象程序设计第三次上机作业Debug心路历程
  20. 安卓开发论坛!阿里P8架构师的Android大厂面试题总结,附赠课程+题库

热门文章

  1. 使用cmd命令进行运行java(cmd命令输出Hello word)
  2. SP1812 LCS2 - Longest Common Substring II
  3. 51Nod 1131 - 覆盖数字的数量(分类讨论)
  4. python对文件的操作
  5. Android学习——uses-sdk标签详解
  6. Java加载Class文件的原理机制
  7. [leetcode]5-Longest Palindromic Substring
  8. 第二次作业刘惠惠2.6,2.15
  9. mysql慢查询监控及sql优化
  10. 350. Intersection of Two Arrays II