人.java
class Person{
String name;
Integer age;
Integer salary;
//...getter..setter
}
人員物件串列:
List<Person> tempList = new ArrayList<>(List.of(new Person("John",33,10000), new Person("Peter",21,2000), new Person("John",18,5000), new Person("Peter",31,6000)));
使用 java 流,我如何告訴我的程式“找到所有同名的人并對他們的年齡和工資執行 SUM 運算”
所以期望的結果是這樣的:
"John", 51, 1500
"Peter", 52, 8000
我試過的:
Map<String,Integer> NameAndSalary= tempList.stream().collect(Collectors.groupingBy(Person::getName,Collectors.summingInt(Person::getSalary) ));
Map<String,Integer> NameAndAge= tempList.stream().collect(Collectors.groupingBy(Person::getName,Collectors.summingInt(Person::getAge) ));
這很好,但這會產生單獨的結果,例如:
"John", 51
和
"John", 1500
有沒有捷徑可以做到:
"John", 51, 1500
uj5u.com熱心網友回復:
正如我在評論中提到的,Java 沒有元組。創建元組的方式是創建一個類似的類。該類Person已經類似于一個元組。因此,我所做的是創建一個 Java 記錄(與 Java POJO 減去樣板代碼相同),然后我收集了同名人員并總結了他們的年齡和薪水,以創建一個同名的復合人員。我的解決方案:
public class TupleDemo {
public static void main(String[] args) {
List<Person> persons = List.of(
new Person("John",33,10000),
new Person("Peter",21,2000),
new Person("John",18,5000),
new Person("Peter",31,6000));
Collection<Person> result = persons.stream().collect(Collectors.groupingBy(p -> p.name(),
Collectors.collectingAndThen(
Collectors.reducing((Person p1, Person p2) -> new Person(p1.name(), p1.age() p2.age(), p1.salary() p2.salary())),
Optional::get))).values();
result.stream().forEach(person ->{
System.out.println("Cumulative person: " person);
});
}
private static record Person(String name, int age, int salary){
@Override
public String toString() {
return "Name: " name ", age: " age ", salary: " salary;
}
}
}
這輸出:
Cumulative person: Name: John, age: 51, salary: 15000
Cumulative person: Name: Peter, age: 52, salary: 8000
代碼所做的是使用流來收集所有Person物件,按名稱分組,并將創建一個Person由先前匹配和當前匹配組成的新物件,其中保留名稱屬性,并將年齡和薪水相加。它將繼續這樣做,直到流被完全消耗。所以,在這個例子中,如果你要添加一個新的“彼得”,他的年齡為 48 歲,薪水為 12000,它將創建一個“復合”彼得,他的年齡為 100 歲,薪水為 20000。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/426713.html
