【问题标题】:How can I group Stream<Person> into Stream<List<Person>>, not into Map<String, <List<Person>>?如何将 Stream<Person> 分组到 Stream<List<Person>>,而不是 Map<String,<List<Person>>?
【发布时间】:2023-04-08 12:51:01
【问题描述】:

我有 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&lt;List&lt;Person&gt;&gt; 而不是Map&lt;String, List&lt;Person&gt;&gt; 变成result?并且不需要钥匙。我可以在不使用 Map-collection 的情况下获得它吗?

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

【问题讨论】:

  • 如果你想要同名人员的列表:result.values() - 如果需要,添加.stream() 作为流(但问题有点不清楚,只给出了必需的类型,而不是什么数据预计)
  • @user16320675 感谢您的回答。我需要带有人员列表的流,其中每个列表中都有同名的人。你的决定是合适的,但在我写的问题的最后,如果没有地图使用是可能的
  • 为什么不想使用地图?如果没有地图,它会渐进地很慢。
  • @OlegSandro,如果您需要按某个字段/属性对人员进行分组,则需要收集到地图中。
  • 好吧,你可以写一个循环只使用列表,但还有什么不应该使用?为什么? (请edit 问题和缺少的信息,例如同名人员的列表,允许 使用的内容,......) - 无论如何,如果你想要一个列表流,列表必须先保存在某个集合中

标签: java java-stream lightweight-stream-api


【解决方案1】:

在构建地图时,返回由Map::values 方法检索到的Collection&lt;List&lt;Person&gt;&gt; 的流:

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

【讨论】:

  • 谢谢。它是有益的。但是,是否有另一种解决方案可以在不使用 Map-collection 的情况下获取同名人员的列表流?因为我们有流,接下来我们有集合,最后我们再次有流。我想也许我们可以在不转换为收藏的情况下做到这一点
  • 我们有Stream&lt;Person&gt;,它可以映射到Stream&lt;List&lt;Person&gt;&gt;,其中每个列表只包含一个Person,但是这些列表需要以某种方式加入/合并以将具有相同的人组合名称,因此需要中间集合和适当的终端操作。
猜你喜欢
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
相关资源
最近更新 更多