Java 流分组依据,自定义值 [duplicate]

Java stream grouping by with custom value [duplicate]

提问人:Garret Wilson 提问时间:11/5/2023 更新时间:11/5/2023 访问量:61

问:

我有一个.使用 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));
java 流 分组

评论

1赞 Abhijit Sarkar 11/5/2023
除了给出的答案外,您还可以使用简单的 for 循环。除非这是家庭作业,否则不必使用 Stream API。

答:

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
文档不会说谎:)