【问题标题】:Java8 Collections Merge two different list with different objects and a common fieldJava8 Collections 合并两个具有不同对象和公共字段的不同列表
【发布时间】:2021-02-09 01:23:25
【问题描述】:

我有两个类,其中有一个公共字段。 基于共同的外勤部门,需要获取所有记录的列表和总金额

根据部门 id 合并记录并对每个部门 id 的金额求和的最佳方法是什么?

// "ABC",(sum(1234.00f+1000.00f))
// "pqr",(sum(1200.00f+500.00f)))
    // Expecting result as line 33, 34
package com.coll.java8.foreach;

public class Plist {
    private String department;
    private String posiName;
    private  double amount;
    


}
package com.coll.java8.foreach;

public class MList {
    
    private String nameString;
    private int id;
    private String department;

    

}
package com.coll.java8.foreach;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.maxBy;

import java.math.MathContext;

public class Managers {
    
    public static void main(String args[]) {
    
    
    List<MList> manList = new ArrayList<MList>();

    manList.add(new MList("Test1",123,"ABC"));
    manList.add(new MList("Test2",134,"pqr"));
    manList.add(new MList("Test3",456,"xyz"));
    
    List<Plist> posslist = new ArrayList<Plist>();
    
    posslist.add(new Plist("ABC","555",1234.00f));
    posslist.add(new Plist("pqr","444",1200.00f));
    posslist.add(new Plist("ABC","555",1000.00f));
    posslist.add(new Plist("xyz","555",25.00f));
    posslist.add(new Plist("pqr","444",500.00f));

    // "ABC",(sum(1234.00f+1000.00f))
    // "pqr",(sum(1200.00f+500.00f)))
    // Expecting result as line 33, 34

}

【问题讨论】:

  • 提示:PList 和 MList 应该派生自包含部门的类。然后阅读和过滤列表变得容易得多。
  • 你需要得到什么总量? MList 没有数量所以当你“合并”列表时你想做什么?
  • 使用它需要的公共字段将数据显示为 "ABC",(sum(1234.00f+1000.00f)) // "pqr",(sum(1200.00f+500.00f)))
  • 你想显示MList的什么信息?部门和金额是PList 的字段,因此根本不需要MList,除非您想要“'Test1 部门的金额总和”之类的内容。

标签: java collections merge


【解决方案1】:

我有两个类,其中有一个公共字段。

不,你没有。您有两个类,每个类都有一个恰好具有相同名称的字段。 Java 不将其视为“公共字段”,因为没有继承或共享接口。

你需要做的是这样的:

public abstract class BaseRecord {
  protected String department;

  public String getDepartment() { return department; }
}

public class PList extends BaseRecord {
...
}

您的某些要求有点难以理解,但如果您想对 PList 的金额求和,您可以使用 List 进行类似这样的操作:

double total = myList.stream()
  .map(item -> item.getAmount())
  .sum();

【讨论】:

    猜你喜欢
    • 2014-05-28
    • 2012-04-03
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 2018-03-18
    相关资源
    最近更新 更多