繁体   English   中英

Java 8添加了对象列表的多个属性的值

[英]Java 8 adding values of multiple property of an Object List

可以说我下面有一个类有getter和setter但只有默认构造函数。

注意:我不允许更改此类的结构。

class Target {

    private String year;
    private String month;
    private String name;
    private double target;
    private double achieved;


    public String getYear() {
        return year;
    }

    public void setYear(String year) {
        this.year = year;
    }

    public String getMonth() {
        return month;
    }

    public void setMonth(String month) {
        this.month = month;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getTarget() {
        return target;
    }

    public void setTarget(double target) {
        this.target = target;
    }

    public double getAchieved() {
        return achieved;
    }

    public void setAchieved(double achieved) {
        this.achieved = achieved;
    }    
}

我必须根据年份和名称添加Target和Achieved列值。

Year Month Name Target Achieved
2018  8    Joey 50.00   10.00
2018  9    Joey 200.00  100.00
2018  9    Fred 200.00  150.00
2018  9    Fred 20.00   50.00

所以输出将是:

Year Month Name Target  Achieved
2018  8    Joey 50.00   10.00
2018  9    Joey 200.00  100.00
2018  9    Fred 220.00  200.00

我已经看到了一个关于如何实现这样的事情的例子,如果我有一个接受参数的构造函数,但是我对于概念Group by并没有那么清楚,并且像SQL lambdas那样在SQL中加总对象?

如何使用默认构造函数来获得相同类型的List<Target>但计算多列的值?

看来你需要根据三件事进行分组: YearMonthName ,所以这看起来像这样:

Collection<Target> merged = yourListOfTargets
            .stream()
            .collect(Collectors.toMap(
                    t -> List.of(t.getYear(), t.getMonth(), t.getName()),
                    Function.identity(),
                    (left, right) -> {
                        left.setTarget(left.getTarget() + right.getTarget());
                        left.setAchieved(left.getAchieved() + right.getAchieved());
                        return left;
                    }))
            .values();

正如Federico在评论中提到的那样,这将改变初始List元素。 您可能没问题,但如果不是,则需要将Function.identity()替换为可从现有Target创建新Target的复制Function。

public class Test8 {
  static class Target {

    String year;
    int target, achieved;
    String month;
    String name;

    public Target(String string, String string2, String name, int achieved, int target) {

      this.year = string;
      this.month = string2;
      this.target = target;
      this.achieved = achieved;
      this.name = name;
    }

    @Override
    public String toString() {
      return "[year=" + year + 
          ", month=" + month 
          + ", target=" + target 
          + ", achieved=" + achieved
          + ", name="
          + name + "]";
    }

  }// target

  public static void main(String[] args) {

    List<Target> list = Arrays.asList(

        new Target("1993", "9", "Protijayi", 1000, 40), 
        new Target("1993", "9", "Protijayi", 600, 400),
        new Target("1987", "11", "Soudipta", 320, 200),
        new Target("1987", "11", "Soudipta", 500, 900),
        new Target("1985", "9", "Tabu", 300, 200),
        new Target("1986", "9", "Tabu", 700, 200)

    );


        Map<List<String>, Target> map = list
        .stream()
        .collect(
            Collectors.groupingBy(
                ch -> List.of(ch.year, ch.month, ch.name), 
                Collectors.collectingAndThen(

            Collectors.reducing(
    (a, b) -> new Target(a.year, a.month, a.name, a.target + b.target,a.achieved + b.achieved)

            ), Optional::get)

        ));
    System.out.println(" MAP ");
    System.out.println(map);
    System.out.println(".................");
    System.out.println(" MAP.VALUES() ");
    System.out.println(map.values());

  }// main

}

/*
  MAP 
{[1993, 9, Protijayi]=[year=1993, month=9, target=1600, achieved=440, name=Protijayi],
 [1985, 9, Tabu]=[year=1985, month=9, target=200, achieved=300, name=Tabu],
  [1987, 11, Soudipta]=[year=1987, month=11, target=820, achieved=1100, name=Soudipta],
   [1986, 9, Tabu]=[year=1986, month=9, target=200, achieved=700, name=Tabu]}
.................
 MAP.VALUES() 
[[year=1993, month=9, target=1600, achieved=440, name=Protijayi], 
[year=1985, month=9, target=200, achieved=300, name=Tabu],
[year=1987, month=11, target=820, achieved=1100, name=Soudipta],
 [year=1986, month=9, target=200, achieved=700, name=Tabu]]
*/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM