Java8 Lambda Collection 的常见用法
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.map.MapUtil;
import lombok.Builder;
import lombok.Data;
import org.junit.Test;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
* @author wangXiaoMing
* @date 2022/04/27 10:46
*/
public class LambdaTest {
@Data
@Builder
private static class DemoEntity {
private Integer id;
private String name;
}
@Test
public void baseTest() {
List<DemoEntity> list = new ArrayList<>();
// 1.取list中的两个值成map - 注意键不能重复和null
Map<Integer, String> stringMap = list.stream().collect(Collectors.toMap(DemoEntity::getId, DemoEntity::getName));
// 2.取list中的某个值成list或set
List<Integer> integers = list.stream().map(DemoEntity::getId).collect(Collectors.toList());
Set<String> strings = list.stream().map(DemoEntity::getName).collect(Collectors.toSet());
// 3.groupBy操作
list.add(DemoEntity.builder().id(2).name("a").build());
list.add(DemoEntity.builder().id(3).name("a").build());
list.add(DemoEntity.builder().id(1).name("b").build());
// {a=[LambdaTest.DemoEntity(id=2, name=a), LambdaTest.DemoEntity(id=3, name=a)], b=[LambdaTest.DemoEntity(id=1, name=b)]}
Map<String, List<DemoEntity>> stringListMap = list.stream().collect(Collectors.groupingBy(DemoEntity::getName));
// [[LambdaTest.DemoEntity(id=2, name=a), LambdaTest.DemoEntity(id=3, name=a)], [LambdaTest.DemoEntity(id=1, name=b)]]
// 注: CollUtil 为hutool中的工具类
List<List<DemoEntity>> groupByField = CollUtil.groupByField(list, "name");
// 4.对list排序
// 4.1 按照name从小到大排序
// [LambdaTest.DemoEntity(id=2, name=a), LambdaTest.DemoEntity(id=3, name=a), LambdaTest.DemoEntity(id=1, name=b)]
List<DemoEntity> sortedStringList = list.stream().sorted(Comparator.comparing(DemoEntity::getName)).collect(Collectors.toList());
// 4.2 按照id从小到大
// [LambdaTest.DemoEntity(id=1, name=b), LambdaTest.DemoEntity(id=2, name=a), LambdaTest.DemoEntity(id=3, name=a)]
List<DemoEntity> sortedIntegerList = list.stream().sorted(Comparator.comparing(DemoEntity::getId)).collect(Collectors.toList());
// 4.3 自定义顺序(id降序)
// [LambdaTest.DemoEntity(id=3, name=a), LambdaTest.DemoEntity(id=2, name=a), LambdaTest.DemoEntity(id=1, name=b)]
List<DemoEntity> orderSortedIntegerList = list.stream().sorted(Comparator.comparing(DemoEntity::getId).reversed()).collect(Collectors.toList());
List<DemoEntity> orderSortedIntegerList1 = list.stream().sorted((i, j) -> j.getId().compareTo(i.getId())).collect(Collectors.toList());
// 4.4 使用hutool工具类排序
List<DemoEntity> hutoolSortList = ListUtil.sort(list, Comparator.comparing(DemoEntity::getId).reversed());
// 4.5 补充对map排序
Map<String, Integer> map = new HashMap<String, Integer>() {{
put("d", 4);
put("e", 6);
put("f", 5);
}};
// 4.5.1 map转集合排序
//{d=4, f=5, e=6}
final Map<String, Integer> sortedMap = new LinkedHashMap<>();
map.entrySet().stream().sorted(Map.Entry.comparingByValue())
.collect(Collectors.toList()).forEach(u -> sortedMap.put(u.getKey(), u.getValue()));
// 4.5.2 hutool对map排序
// {d=4, f=5, e=6}
LinkedHashMap<String, Integer> sortByEntry = CollUtil.sortByEntry(map, Map.Entry.comparingByValue());
// {e=6, f=5, d=4}
Map<String, Integer> sortByEntry1 = MapUtil.sortByValue(map, true);
// 4.5.3 当按照值排序, 且值中有null值时
map.put("a", null);
// {a=null, d=4, f=5, e=6}
LinkedHashMap<String, Integer> sortByEntry2 = CollUtil.sortByEntry(map, Map.Entry.comparingByValue(Comparator.nullsFirst(Integer::compareTo)));
// 5.取两个list的交集 - 若为对象数组, 在流中使用map即可
// 参考: https://blog.csdn.net/a646705816/article/details/111927462
List<Integer> listA = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> listB = Arrays.asList(1, 4, 5, 6, 2);
// [1, 2, 4, 5]
List<Integer> intersect = listA
.stream()
.filter(a -> listB.stream().anyMatch(b -> Objects.equals(a, b)))
.collect(Collectors.toList());
// 6.取差集 换成noneMatch即可
// [3]
List<Integer> intersect1 = listA
.stream()
.filter(a -> listB.stream().noneMatch(b -> Objects.equals(a, b)))
.collect(Collectors.toList());
// 7.求和
// 15
long sum = listA.stream().collect(Collectors.summarizingInt(u -> u)).getSum();
// 6
long sum1 = list.stream().collect(Collectors.summarizingInt(DemoEntity::getId)).getSum();
// 6
int sum2 = list.stream().mapToInt(DemoEntity::getId).sum();
// 8.取两个List中的值组成map, 要求list大小相等
// 使用hutool工具类深拷贝
List<DemoEntity> list1 = BeanUtil.copyToList(list, DemoEntity.class);
// 对于对象的性能未作测试 !!! 可能时间会长
// {1=b, 2=a, 3=a}
Map<Integer, String> collect = IntStream.range(0, list.size()).boxed().collect(Collectors.toMap(list.stream().map(DemoEntity::getId).collect(Collectors.toList())::get,
list1.stream().map(DemoEntity::getName).collect(Collectors.toList())::get));
// 9.其他用法如: filter(过滤掉不想要的数据), forEach, remove, removeIf, merge, distinct等未做整理
// 参考:
// https://stackoverflow.com/questions/46873916/java-8-merge-2-string-lists-into-map
// https://blog.csdn.net/a646705816/article/details/111927462
// https://objcoding.com/2019/03/04/lambda/
// https://blog.51cto.com/u_14479502/3115693
// https://blog.csdn.net/u014231523/article/details/102535902
// https://copyfuture.com/blogs-details/202202120151292216 - 其中对排序有第二排序位的样例
}
}

扩展
- List对象分组取分组list中的一个字段成list
// 用id1分组(结果是键id, 值是对象list), 取值(对象list)中的id2成List<Integer>
Map<Integer, List<Integer>> id1Id2ListMap = list
.stream()
.collect(Collectors.groupingBy(Entity::getId1, Collectors.mapping(Entity::getId2, Collectors.toList())));
List<List<T>>转成List<T>list.stream().flatMap(List::stream).collect(Collectors.toList());
Java8 Lambda Collection 的常见用法的更多相关文章
- Java8 Lambda和Stream的用法
package com.zhangxueliang.demo; import java.util.ArrayList; import java.util.List; import java.util. ...
- Java8 新特性学习 Lambda表达式 和 Stream 用法案例
Java8 新特性学习 Lambda表达式 和 Stream 用法案例 学习参考文章: https://www.cnblogs.com/coprince/p/8692972.html 1.使用lamb ...
- java8 Lambda表达式的新手上车指南(1)
背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式 ...
- java8 Lambda表达式的新手上车指南(1)--基础语法和函数式接口
背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式 ...
- Guava中Predicate的常见用法
Guava中Predicate的常见用法 1. Predicate基本用法 guava提供了许多利用Functions和Predicates来操作Collections的工具,一般在 Iterabl ...
- 【Java学习笔记之三十一】详解Java8 lambda表达式
Java 8 发布日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Java 8之前 ...
- java8在Collection中新增加的方法removeIf
记得我在以前找工作的经历中,遇到过一个面试官问过我一个很基础的问题.问题是:有一个List中有10个元素,我现在想从中删除3个元素,请问怎么做?我当时也没想,就直接说,List的有自带的remove方 ...
- python3 字典常见用法总结
python3 字典常见用法总结 Python字典是另一种可变容器模型,且可存储任意类型对象,如字符串.数字.元组等其他容器模型. 一.创建字典 字典由键和对应值成对组成.字典也被称作关联数组或哈希表 ...
- java8 快速入门 lambda表达式 Java8 lambda表达式10个示例
本文由 ImportNew - lemeilleur 翻译自 javarevisited.欢迎加入翻译小组.转载请见文末要求. Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发 ...
- JAVA8 Lambda初体验
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.u ...
随机推荐
- 数组中的常见异常: 1. 数组角标越界的异常:ArrayIndexOutOfBoundsExcetion 2. 空指针异常:NullPointerException
数组中的常见异常: 1. 数组角标越界的异常:ArrayIndexOutOfBoundsExcetion 2. 空指针异常:NullPointerException package com.ch ...
- Navicat怎样查看数据库密码
Navicat怎样查看数据库密码 前言 本文来源:Navicat怎样查看数据库密码_低端玩家的博客-CSDN博客_navicat查看数据库密码 主要是怕作者删帖,因此备份 开始 1.导出链接 2.一定 ...
- DeepSeekV3+Roo Code,智能编码好助手
前言 硅基流动最近上线了deepseek-ai/DeepSeek-R1与deepseek-ai/DeepSeek-V3,感兴趣快来试试吧! 邀请注册得14元不过期额度:https://cloud.si ...
- 从DNS配置到Pacemaker部署:一步步教你在Linux平台上实现AlwaysOn集群
从DNS配置到Pacemaker部署:一步步教你在Linux平台上实现AlwaysOn集群 AlwaysOn集群是SQL Server里唯一推荐的高可用性架构, 在AlwaysOn高可用性架构中,有非 ...
- python切换版本
查看系统有什么版本的python ls/usr/bin/python* 1方法.通过修改 ~/.bashrc 文件更改python版本 alias python='/usr/bin/python3.4 ...
- FreeSql学习笔记——2.插入
前言 由于还没有表结构,就先从新增开始,插入一些数据后才好做查询.修改.删除操作. 初始化 前面注入FreeSql时设置过自动同步表结构,那么就不用管数据库了,只需要在项目中定义实体,就会自动生成表结 ...
- keil优化等级说明 keil code optimization
其中 0级(Constan folding)的优化包括: a.常数折叠:只要有可能,编译器就执行将表达式化为常数数字的计算,其中包括运行地址的计算. b. 简单访问优化:对8051系统的内部数据和位地 ...
- autMan奥特曼机器人-安装或更新golang依赖
autMan2.3.4及以上需要更新中间件或安装golang依赖,参照下列步骤: 一.直装版本 ssh下进入autMan文件夹下plugin/scripts下面输入以下指令: go get -u gi ...
- Nginx - [01] 概述
客户端访问增加.并发量增大. 001 || 什么是Nginx Nginx是一个高性能的HTTP和反向代理Web服务器,同时也提供了IMAP/POP3/SMTP服务. 占有内存少,并发能力强. 002 ...
- 使用mybatis-plus转换枚举值
1. 使用mybatis-plus转换枚举值 枚举值转换方式有很多,有以下方式: 后端写一个通用方法,只要前端传枚举类型,后端返回相应的枚举值前端去匹配 优点:能够实时保持数据一致性 缺点:如果有大量 ...