listgroupbyjava_Java8GroupBy⼀个字段然后映射到多个字段您还可以尝试将作为下游函数传递的⾃定义收集器定义到upingBy().考虑以下⽰例:
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collector;
import java.util.stream.Collectors;
public class PersonGroupByExample {
public static void main(String[] args) {
final List> input = Arrays.asList(
new HashMap(){{
put("userId","user1");
put("firstName","John");
put("lastName","Smith");
put("courses","course1");
}},new HashMap
}},"course3");
}},"user2");
put("firstName","Jack");
put("lastName","course2");
}}
);
final Collection result = input.stream()
.parallel()
.upingBy(it -> it.get("userId"),Collector.of(
// Start with an empty Person object
Person::new,// Collect a list of map objects grouped by the same userId into a single Person object
(person,map) -> {
// Override common properties
person.OrDefault("userId","").toString());
person.OrDefault("firstName","").toString());
person.OrDefault("lastName","").toString());
// Add person's course to a courses set
return person;
}
))).values();
result.forEach(System.out::println);
}
static class Person {
groupby分组
String userId;
String firstName;
String lastName;
Set courses = new HashSet<>();
public Person() {}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Set getCourses() {
return courses;
}
public void setCourses(Set courses) { urses = courses;
}
@Override
public String toString() {
return "Person{" +
"userId='" + userId + '\'' +
",firstName='" + firstName + '\'' +
",lastName='" + lastName + '\'' +
",courses=" + courses +
'}';
}
}
static class Course {
String id;
public Course(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Override
public String toString() {
return "Course{" +
"id='" + id + '\'' +
'}';
}
}
}
最后,我们调⽤Map.values()⽅法返回Collection< Person>⽽不是Map< String,Person>.
运⾏此⽰例将创建以下输出:
Person{userId='user1',firstName='John',lastName='Smith',courses=
[Course{id='course1'},Course{id='course3'},Course{id='course2'}]}
Person{userId='user2',firstName='Jack',courses=[Course{id='course2'},Course{id='course1'}]}