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

如何用Java Streams筛选所有name属性重复的City实例

获取所有name属性重复的City实例(Java Streams实现)

需求说明

从给定的City类实例列表中,筛选出所有name属性重复的实例,要求保留每个重复name对应的全部实例(例如示例中3个Lisboa、3个Braga、2个Guarda都需包含在结果列表中),且必须使用Java Streams实现。

解决方案

核心思路分为两步:

  1. 先统计每个name在列表中的出现次数
  2. 基于统计结果,过滤出所有name出现次数大于1的City实例

完整代码示例

City类

import java.util.Objects;

public class City {
    private String name;
    private String province;
    private int population;

    public City(String name, String province, int population) {
        this.name = name;
        this.province = province;
        this.population = population;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getProvince() {
        return province;
    }

    public void setProvince(String district) {
        this.province = district;
    }

    public int getPopulation() {
        return population;
    }

    public void setPopulation(int population) {
        this.population = population;
    }

    @Override
    public String toString() {
        return String.format("|name: %s; district: %s; population: %s|", name, province, population);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        City city = (City) o;
        return population == city.population && Objects.equals(name, city.name) && Objects.equals(province, city.province);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, province, population);
    }
}

Main类

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<City> portugalCities = List.of(
                new City("Lisboa", "Estremadura", 2275591),
                new City("Lisboa", "Estremadura", 2275591),
                new City("Faro", "Algarve", 67650),
                new City("Braga", "Minho", 193324),
                new City("Braga", "Esposende", 193324),
                new City("Braga", "Fafe", 193324),
                new City("Alentejo", "Ribatejo", 704533),
                new City("Viseu", "Beira Alta", 99561),
                new City("Lisboa", "Alenquer", 2275591),
                new City("Guarda", "Almeida", 143019),
                new City("Guarda", "Aguiar da Beira", 143019)
        );

        // 统计每个name的出现次数
        Map<String, Long> nameCountMap = portugalCities.stream()
                .collect(Collectors.groupingBy(City::getName, Collectors.counting()));

        // 筛选出所有name重复的City实例
        List<City> duplicateNameCities = portugalCities.stream()
                .filter(city -> nameCountMap.get(city.getName()) > 1)
                .collect(Collectors.toList());

        // 输出结果验证
        duplicateNameCities.forEach(System.out::println);
    }
}

代码解释

  • 统计name出现次数:使用Collectors.groupingBy(City::getName, Collectors.counting())将列表按name分组,同时统计每组的元素数量,得到一个Map<String, Long>,key为City的name,value为该name出现的次数。
  • 过滤重复实例:再次遍历原列表,通过filter方法保留那些name对应的统计次数大于1的实例,最终收集成结果列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:32:51