提问人:Garret Wilson 提问时间:11/5/2023 更新时间:11/5/2023 访问量:61
Java 流分组依据,自定义值 [duplicate]
Java stream grouping by with custom value [duplicate]
问:
我有一个.使用 Java 流,我可以使用如下方法按姓氏对人员进行分组:List<Person>
Map<String, List<Person>> persons.stream()
.collect(Collectors.groupingBy(Person::getLastName));
但是,如果我想按姓氏对人员的名字进行分组怎么办?换句话说,按姓氏“史密斯”分组,我可能会有一个“简”和“约翰”的列表。是否有我可以使用的价值提取器版本?我在想这样的事情:groupingBy()
Map<String, List<String>> persons.stream()
.collect(Collectors.groupingBy(Person::getLastName, Person::getFirstName));
答:
3赞
Sash Sinha
11/5/2023
#1
尝试使用收集器。mapping()
作为 Collectors 中的下游收集器。groupingBy()
方法:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
class Main {
public static void main(String[] args) {
List<Person> persons = List.of(
new Person("Smith", "John"),
new Person("Doe", "Jane"),
new Person("Smith", "Alex"),
new Person("Doe", "John"),
new Person("Brown", "Charlie")
);
Map<String, List<String>> groupedByLastName = persons.stream()
.collect(Collectors.groupingBy(
Person::getLastName,
Collectors.mapping(Person::getFirstName, Collectors.toList())
));
System.out.println(groupedByLastName);
}
}
class Person {
private String lastName;
private String firstName;
public Person(String lastName, String firstName) {
this.lastName = lastName;
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public String getFirstName() {
return firstName;
}
@Override
public String toString() {
return "Person{lastName='" + lastName + "', firstName='" + firstName + "'}";
}
}
输出:
{Brown=[Charlie], Smith=[John, Alex], Doe=[Jane, John]}
评论
0赞
Garret Wilson
11/5/2023
哦,好的。我错过了这一点,因为该方法需要一个额外的收集器(例如),我没有预料到。我现在看到它是如何工作的。文档甚至有一个与我的示例几乎相同的示例。😆 谢谢。toList()
0赞
Sash Sinha
11/5/2023
文档不会说谎:)
评论