java8 lamdba使用示例
使用示例
首先将下方附录中json数据转换为List,使用的是hutool中的JSONUtil工具类
List<Demo> personList = JSONUtil.toList(JSONUtil.parseArray(json), Demo.class);
主键 | 姓名 | 分数 | 课程名称 | 教师名称 |
---|---|---|---|---|
1 | 张三 | 56 | 语文 | 语教一 |
2 | 张三 | 78 | 数学 | 数教一 |
3 | 李四 | 99 | 语文 | 语教一 |
4 | 李四 | 23 | 数学 | 数教二 |
5 | 王五 | 87 | 语文 | 语教一 |
6 | 王五 | 59 | 数学 | 数教一 |
7 | 王五 | 65 | 英语 | 英教一 |
条件过滤
// 过滤分数大于60的学生
List<Demo> filterPersonList = personList.stream().filter(a -> a.getScore() > 60).collect(Collectors.toList());
主键 | 姓名 | 分数 | 课程名称 | 教师名称 |
---|---|---|---|---|
2 | 张三 | 78 | 数学 | 数教一 |
3 | 李四 | 99 | 语文 | 语教一 |
5 | 王五 | 87 | 语文 | 语教一 |
7 | 王五 | 65 | 英语 | 英教一 |
条件过滤后将所有分数替换为100分
personList.stream().filter(a -> a.getScore() > 60).forEach(a -> a.setScore(100L));
把List 转化为 Map<String, List>
// 以姓名为key,教师的list为value
Map<String, List<String>> map = personList.stream().collect(
Collectors.groupingBy(
Demo::getName,
Collectors.mapping(Demo::getTeacher, Collectors.toList())
));
// 结果map
{李四=[语教一, 数教二], 张三=[语教一, 数教一], 王五=[语教一, 数教一, 英教一]}
获取单独一个对象的list
// 所有分数
List<Long> scoreList = personList.stream().map(Demo::getScore).collect(Collectors.toList());
// 结果
[56, 78, 99, 23, 87, 59, 65]
// 所有学生
Set<String> nameList = personList.stream().map(Demo::getName).collect(Collectors.toSet());
// 结果
[李四, 张三, 王五]
排序
// 根据id正序排序
personList.stream().sorted(Comparator.comparing(Demo::getId)).collect(Collectors.toList());
// 根据id倒序排序
personList.stream().sorted(Comparator.comparing(Demo::getId).reversed()).collect(Collectors.toList());
list转为Map<String, Demo>
// 以id为key,Demo对象为value
Map<Integer, Demo> personMap = personList.stream().collect(Collectors.toMap(Demo::getId, a -> a));
// 结果
{1=Demo(id=1, name=张三, score=56, course=语文, teacher=语教一), 2=Demo(id=2, name=张三, score=78, course=数学, teacher=数教一), 3=Demo(id=3, name=李四, score=99, course=语文, teacher=语教一), 4=Demo(id=4, name=李四, score=23, course=数学, teacher=数教二), 5=Demo(id=5, name=王五, score=87, course=语文, teacher=语教一), 6=Demo(id=6, name=王五, score=59, course=数学, teacher=数教一), 7=Demo(id=7, name=王五, score=65, course=英语, teacher=英教一)}
Map<String, Demo>排序
// 根据上方map中的value的分数从低到高排序
Map<Integer, Demo> map = personMap.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue(Comparator.comparingLong(Demo::getScore)))
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(oldValue, newValue) -> oldValue, LinkedHashMap::new));
// 结果
{4=Demo(id=4, name=李四, score=23, course=数学, teacher=数教二), 1=Demo(id=1, name=张三, score=56, course=语文, teacher=语教一), 6=Demo(id=6, name=王五, score=59, course=数学, teacher=数教一), 7=Demo(id=7, name=王五, score=65, course=英语, teacher=英教一), 2=Demo(id=2, name=张三, score=78, course=数学, teacher=数教一), 5=Demo(id=5, name=王五, score=87, course=语文, teacher=语教一), 3=Demo(id=3, name=李四, score=99, course=语文, teacher=语教一)}
合计操作
// 计算总分
long total = personList.stream().mapToLong(Demo::getScore).sum();
// 结果
467
list转为Map<Object, Long>,list中key唯一
// 转为以主键为key,分数为value的Map
Map<Integer, Long> idMap = personList.stream().collect(Collectors.toMap(Demo::getId, Demo::getScore, (value1, value2) -> value2));
// 结果
{1=56, 2=78, 3=99, 4=23, 5=87, 6=59, 7=65}
list转为Map<Object, Long>,list中key不唯一
// 转为以姓名为key,分数合计为value的Map
Map<String, Long> map = personList.stream().collect(
Collectors.groupingBy(
Demo::getName,
Collectors.summingLong(Demo::getScore)
));
// 结果
{李四=122, 张三=134, 王五=211}
将list中的list集合转为一个所有属性集合的大集合
Set<Long> dataScope = sysUser.getTierVos().stream().map(EntierVO::getUnitIdList).flatMap(Collection::stream).collect(Collectors.toSet());
附录-类
/**
* 类 Demo
* </p>
*
* @author ChenQi
* @since 2020-04-12 09:35:00
*/
@Data
public class Demo {
/**
* 主键
*/
private Integer id;
/**
* 姓名
*/
private String name;
/**
* 分数
*/
private Long score;
/**
* 课程名称
*/
private String course;
/**
* 教师名称
*/
private String teacher;
}
附录-JSON数据
[
{
"id": 1,
"name": "张三",
"score": 56,
"course": "语文",
"teacher": "语教一",
},
{
"id": 2,
"name": "张三",
"score": 78,
"course": "数学",
"teacher": "数教一",
},
{
"id": 3,
"name": "李四",
"score": 99,
"course": "语文",
"teacher": "语教一",
},
{
"id": 4,
"name": "李四",
"score": 23,
"course": "数学",
"teacher": "数教二",
},
{
"id": 5,
"name": "王五",
"score": 87,
"course": "语文",
"teacher": "语教一",
},
{
"id": 6,
"name": "王五",
"score": 59,
"course": "数学",
"teacher": "数教一",
},
{
"id": 7,
"name": "王五",
"score": 65,
"course": "英语",
"teacher": "英教一",
},
]
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ALLBS!
评论