1 回答

TA貢獻1789條經驗 獲得超8個贊
這個λ:
Map<String, List<HashMap<String, Object>>> xxx = arrList.stream().collect(Collectors.groupingBy(x -> ((int) x.get("ID") + "") + x.get("NAME")));
給出的結果如下:
但是,如上所述 - 您應該使用(如果可能)對象而不是數組。對于對象,lambda 將如下所示:
Map<String, List<Person>> xxx = arrList.stream().collect(Collectors.groupingBy(x -> x.getName() + x. getId()));
但是由于您有 Person 類,因此您可以覆蓋等于以滿足您的需求,并且可以在一個簡單的 lambda 中映射和求和工作時間:
Map<Person, Double> result = arrList.stream().collect(Collectors.groupingBy(x -> x, Collectors.summingDouble(Person::getWorkTime)));
這就是結果 - 將人員地圖作為鍵,將工作時間摘要作為值。
人員類的代碼:
public class Person {
String name;
int id;
double workTime;
public Person(String name, int id, double workTime) {
this.name = name;
this.id = id;
this.workTime = workTime;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return id == person.id &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, id);
}
}
示例代碼:
Person person1 = new Person("Edward", 1, 20);
Person person2 = new Person("Krzych", 1, 6);
Person person3 = new Person("Edward", 1, 13.5);
Person person4 = new Person("Grzesiek", 2, 50);
Person person5 = new Person("Edward", 2, 12);
ArrayList<Person> arrList = new ArrayList<>();
arrList.add(person1);
arrList.add(person2);
arrList.add(person3);
arrList.add(person4);
arrList.add(person5);
Map<Person, Double> result = arrList.stream().collect(Collectors.groupingBy(x -> x, Collectors.summingDouble(Person::getWorkTime)));
添加回答
舉報