使用示例

首先将下方附录中json数据转换为List,使用的是hutool中的JSONUtil工具类

List<Demo> personList = JSONUtil.toList(JSONUtil.parseArray(json), Demo.class);

image-20220705171728414

主键 姓名 分数 课程名称 教师名称
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": "英教一",
  },
]