You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java Stream获取每个城市的唯一Person实例并转为列表?

用Stream获取每个城市的单个Person实例

要实现这个需求,你可以通过两种常见的Stream处理方式来完成:

方法一:利用Collectors.toMap去重(保留首个实例)

通过将城市作为Map的Key,Person实例作为Value,遇到重复Key时保留已存在的实例(即该城市第一个出现的Person),最后将Map的Value转为List即可:

import java.util.stream.Collectors;

// 基于原代码中的people集合处理
List<Person> uniqueCityPeople = people.stream()
    .collect(Collectors.toMap(
        person -> person.city,  // 以city作为去重判断的Key
        person -> person,       // 映射对应的Person实例
        (existing, replacement) -> existing  // 重复Key时保留第一个出现的实例
    ))
    .values()  // 获取所有唯一城市对应的Person实例
    .stream()
    .collect(Collectors.toList());

方法二:分组后取每组首个元素

先按城市分组,再从每个分组中取出第一个元素,最后收集为List:

import java.util.stream.Collectors;

List<Person> uniqueCityPeople = people.stream()
    .collect(Collectors.groupingBy(person -> person.city))  // 按city分组,得到Map<String, List<Person>>
    .values()
    .stream()
    .map(group -> group.get(0))  // 取每个城市分组的第一个Person实例
    .collect(Collectors.toList());

两种方法的区别

  • 方法一的toMap更高效,它不需要存储同一城市的所有Person实例,遇到重复Key时直接跳过后续实例;
  • 方法二的groupingBy会先保存每个城市的所有Person,适合需要对分组做额外处理的场景(比如后续要获取每个城市的全部人员)。

注意:原代码中Person类的city字段是public的,所以直接访问person.city即可;如果是规范的封装类,建议使用getter方法(如Person::getCity)替代直接访问字段。

内容的提问来源于stack exchange,提问作者Gabriel Gavrilov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 14:24:30