我在列表中有带有P1{Salary,Tax,'C or D'}
的Persons对象。想做以下两件事
1.将所有Person对象隔离为一个person对象(现有Person对象中的任何一个),其中此person对象的薪水将为所有其“ CreditOrDebit”标志为“ C”的对象薪水之和。并将其添加到ArrayList中。
2.想将所有带有“ CreditOrDebit”标志为“ D”的剩余Person对象添加到数组列表(我曾在第1点中添加过)
这里是例子:
Class Person{
int sal,tax;
String CreditOrDebit;
//with setters and getters
}
例如:输入:
Person1(1000, 10,"C");
Person2(4000, 15,"D");
Person3(6000, 15,"D");
Person4(8000, 10,"C");
Person5(5000, 10,"C");
输出:
New Person1(4000, 15, "D")
New Person2(6000, 15, "D")
New Person3(14000, 10, "C")
我需要的是比这更有效的代码。作为这段代码,我在项目中的很多地方都使用了
。谢谢!
答案 0 :(得分:2)
对于可以为每种类型的交易求和的解决方案,可以使用Collectors.groupingBy
。这就像一个SQL group by。您可以为所需分组指定“键”和功能。接下来,我将按type
分组并求和salary
:
List<Person> persons = new ArrayList<>();
persons.add(new Person(1000, "C"));
persons.add(new Person(500, "D"));
persons.add(new Person(100, "C"));
persons.add(new Person(1500, "C"));
persons.add(new Person(750, "D"));
Map<String, Integer> result = persons.stream().collect(
Collectors.groupingBy(Person::getType, //group by type
Collectors.summingInt(Person::getSalary))); //sum salary
System.out.println(result);
{C = 2600,D = 1250}
创建新的Person
的部分很容易。只需迭代Map
并构建一个新实例:
List<Person> summary = result.entrySet().stream()
.map(e -> new Person(e.getValue(), e.getKey()))
.collect(Collectors.toList());
System.out.println(summary);
请注意,这不是Person
中的信息。实例名称在这里没有意义...您应予以更正。
这使用了以下类描述:
class Person {
int salary;
String type;
public Person(int salary, String type) {
super();
this.salary = salary;
this.type = type;
}
public int getSalary() {
return salary;
}
public String getType() {
return type;
}
}
答案 1 :(得分:0)
您可以做到Java 8的功能风格:
int sumOfC
= persons.stream()
.filter(person -> person.getCreditOrDebit().equals("C"))
.mapToInt(person -> person.getSalary()).sum();
然后
Person p = new Person(sumOfC, tax, "C");
同样,您可以为D
Java 7样式:
int sumOfC = 0;
for (Person person : persons) {
if (person.getCreditOrDebit().equals("C")){
sum += person.getSalary();
}
}
Person p = new Person(sumOfC, tax, "C");