Java8_stream_集合对象属性的合并

Java8_stream_集合对象属性的合并

举例:

在实际的业务处理中,我们经常会碰到需要合并同一个集合内相同属性对象的情况, 需要对一个List中的对象进行唯一值属性去重,属性求和。

业务范例:

// 统计每个学生的 总分

Student(name=张三, subject=数学, grade=92.5);
Student(name=张三, subject=语文, grade=80.0);
Student(name=李四, subject=数学, grade=88.5);
Student(name=李四, subject=语文, grade=90.5);
Student(name=王五, subject=数学, grade=100.0);
Student(name=王五, subject=语文, grade=60.0);

期望结果:

Student(name=李四, subject=语文/数学, grade=179.0)
Student(name=张三, subject=语文/数学, grade=172.5)
Student(name=王五, subject=语文/数学, grade=160.0)

思路:

  1. list做循环求和,去重

  2. Java8的流进行处理

 

代码:

import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {
        List<Student> list1 = initData();
        List<Student> list2 = initData();
        List<Student> list3 = initData();

        // 方法一: list做循环求和,去重
        List<Student> students1 = method01(list1);
        students1.forEach(System.out::println);

        System.out.println("====================================");

        // 方法二: Java8的流进行处理
        List<Student> students2 = method02(list2);
        students2.forEach(System.out::println);

        System.out.println("====================================");

        // 方法三
        List<Student> students3 = method03(list3);
        students3.forEach(System.out::println);
    }

    // 方法一: list做循环求和,去重
    private static List<Student> method01(List<Student> list) {
        Map<String, Student> map = new HashMap<>();
        list.stream().forEach(a -> {
                    Student last = map.get(a.getName());
                    if(null != last){
                        a.setGrade(a.getGrade() + last.getGrade());
                        a.setSubject(a.getSubject() + "/" + last.getSubject());
                    }
                    map.put(a.getName(), a);
                });
        return map.values().stream().collect(Collectors.toList());
    }

    // 方法二: Java8的流进行处理
    private static List<Student> method02(List<Student> list) {
        List<Student> result = list.stream().collect(Collectors.toMap(Student::getName, a -> a, (o1, o2) -> {
            o1.setGrade(o1.getGrade() + o2.getGrade());
            o1.setSubject(o1.getSubject() + "/" + o2.getSubject());
            return o1;
        })).values().stream().collect(Collectors.toList());
        return result;
    }

    // 方法三
    private static List<Student> method03(List<Student> list) {
        List<Student> students = new ArrayList<>();
        list.stream().collect(Collectors.groupingBy(o -> o.getName(), Collectors.toList())).forEach(
                (id, transfer) -> {
                    transfer.stream().reduce((a, b) ->
                            new Student(a.getName(), a.getSubject() + "/" + b.getSubject(), a.getGrade() + b.getGrade())).ifPresent(students::add);
                }
        );
        return students;
    }

    private static List<Student> initData(){
        List<Student> students =  new ArrayList<>();
        students.add(new Student("张三", "数学", 92.5));
        students.add(new Student("张三", "语文", 80));
        students.add(new Student("李四", "数学", 88.5));
        students.add(new Student("李四", "语文", 90.5));
        students.add(new Student("王五", "数学", 100));
        students.add(new Student("王五", "语文", 60));
        return students;
    }
}

@Data
@AllArgsConstructor
class Student {
    private String name; // 学生名称
    private String subject; // 学科
    private double grade; // 成绩
}

执行结果:

Student(name=李四, subject=语文/数学, grade=179.0)
Student(name=张三, subject=语文/数学, grade=172.5)
Student(name=王五, subject=语文/数学, grade=160.0)
====================================
Student(name=李四, subject=数学/语文, grade=179.0)
Student(name=张三, subject=数学/语文, grade=172.5)
Student(name=王五, subject=数学/语文, grade=160.0)
====================================
Student(name=李四, subject=数学/语文, grade=179.0)
Student(name=张三, subject=数学/语文, grade=172.5)
Student(name=王五, subject=数学/语文, grade=160.0)

 

原文地址:https://www.cnblogs.com/mmdz/p/15623976.html