如何将 Stream<Person>分组到 Stream<List<Person>>,而不是 Map<String、<List<Person>>?

How can I group Stream<Person> into Stream<List<Person>>, not into Map<String, <List<Person>>?

提问人:Oleg Sandro 提问时间:11/23/2021 最后编辑:Oleg Sandro 更新时间:11/23/2021 访问量:100

问:

我有 POJO 类:

@Data
@AllArgsConstructor
public class Person {
    private String name;
    private String surname;
}

我有一些可执行代码:

public class Main {

    public static void main(String[] args) {
        Person john1 = new Person("John", "Smith");
        Person john2 = new Person("John", "Brown");
        Person nancy1 = new Person("Nancy", "James");
        Person nancy2 = new Person("Nancy", "Williams");
        Person kate1 = new Person("Kate", "Fletcher");

        List<Person> persons = List.of(john1, kate1, john2, nancy1, nancy2);
        Map<String, List<Person>> result = persons.stream().collect(Collectors.groupingBy(Person::getName));
        System.out.println(result);
    }
}

我怎样才能进入?并且不需要钥匙。我可以在没有使用地图集合的情况下获得它吗?Stream<List<Person>>Map<String, List<Person>>result

UPD:每个列表中都有同名的人

java java-stream 轻量级流 API

评论

2赞 user16320675 11/23/2021
如果您想要同名人员的列表: - 如果需要,请添加一个 Stream (但问题有点不清楚,只给出了必需的类型,而不是预期的数据)result.values().stream()
0赞 Oleg Sandro 11/23/2021
@user16320675 感谢您的回答。我需要与名单的人一起流,其中每个名单中都有同名的人。你的决定是合适的,但是在我的问题结束时,我写道,如果可以不使用地图
0赞 Sweeper 11/23/2021
为什么不想使用地图?如果没有地图,它会很慢。
0赞 Nowhere Man 11/23/2021
@OlegSandro,如果您需要按某些字段/属性对人员进行分组,则需要收集到地图中。
1赞 user16320675 11/23/2021
好吧,你可以写一个循环,只使用列表,但还有什么不应该使用呢?为什么?(请编辑问题和缺失的信息,例如与同名人员的列表,不允许使用的内容,...- 无论如何,如果你想要一个列表流,必须首先将列表保存在某个集合中

答:

3赞 Nowhere Man 11/23/2021 #1

构建映射后,返回检索到的流:Collection<List<Person>>Map::values

Stream<List<Person>> stream = persons.stream()
        .collect(Collectors.groupingBy(Person::getName))
        .values() // Collection<List<Person>>
        .stream(); // Stream<List<Person>> 

评论

0赞 Oleg Sandro 11/23/2021
谢谢。这很有用。但是,是否有另一种解决方案可以在不使用地图集合的情况下获取具有同名人员的列表流?因为我们有流,接下来我们有集合,最后我们又有了流。我想也许我们可以在不转换为收集的情况下做到这一点
0赞 Nowhere Man 11/23/2021
我们有 ,可以映射到每个列表只包含一个 ,但是这些列表需要以某种方式加入/合并以组合具有相同名称的人,因此需要中间收集和适当的终端操作。Stream<Person>Stream<List<Person>>Person