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)

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM