java - 流按属性不同但被另一个属性排除

标签 java collections java-stream distinct-values

设置和问题
我在一个简单的 Java 数据类上有一个流,例如:

class Candidate{
    private Long id;
    private String fullName;
    private String job;
    private String adress;
}
我想通过两个属性过滤我的流:
  • 删除所有重复项 job
  • 但让每个人都与 adress "Italy"不管 job

  • 例子
    考虑一个示例数据集,如


    ID
    全名
    工作
    地址


    1
    彼得·布莱特
    IT工程师
    意大利

    2
    帕特里克·马农
    电子工程师
    西类牙

    3
    鲍勃·吉娜
    IT工程师
    瑞士

    4
    亚历山大·拉约
    安全工程师
    英国


    或在 Java 中:
    Candidate c1 = new Candidate(1,"Peter Bright","IT Engineer","Italy");
    Candidate c2 = new Candidate(2,"Patrick Manon","Electronics engineer","Spain");
    Candidate c3 = new Candidate(3,"Bob Jina","IT Engineer","Suisse");
    Candidate c4 = new Candidate(4,"Alexander Layo","Security Engineer","UK");
    
    Stream<Candidate> candidates = Stream.of(c1, c2, c3, c4);
    
    我想以结果为的方式过滤流:


    ID
    全名
    工作
    地址


    1
    彼得·布莱特
    IT工程师
    意大利

    2
    帕特里克·马农
    电子工程师
    西类牙

    4
    亚历山大·拉约
    安全工程师
    英国


    请注意 Bob JinaIT Engineer 起被移除已经在那里了。
    如果有来自意大利的重复候选人,我们需要保留所有候选人

    最佳答案

    您可以 Collection 到 Candidate 的 map s,使用 job作为关键并在发生冲突时保留意大利候选人:

    Collection<Candidate> result = candidates.stream()
        .collect(Collectors.toMap(
            Candidate::getJob,
            Function.identity(),
            (c1, c2) -> "italy".equalsIgnoreCase(c1.getAddress()) ? c1 : c2,
            LinkedHashMap::new))
        .values();
    
    这使用了 Collectors.toMap 的过载接受四个参数。
    我正在收集到 LinkedHashMap保留插入顺序。
    此解决方案在 Collection 中返回候选者, 如果您需要 List ,从集合中创建它:
    List<Candidate> list = new ArrayList<>(result);
    

    关于java - 流按属性不同但被另一个属性排除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68866003/

    相关文章:

    java - 访问 Mockito/Powermock 中的匿名 Runnable 实例

    java - 为什么 Collections 中的方法没有放在 AbstractCollection 中?

    java - 无法使用 Lambda Stream Filter 获得响应

    java - 关于 Robert Sedgewick 的插入排序改进

    java - 嵌套通配符调用方法编译失败

    java - 了解 Java 中 processbuilder 的示例代码

    java - 检查 Collection 或 Map 是否为空或 null 的方法?

    javascript - 合集部分懒人下载

    java - 在 Java 8 中映射后过滤空值

    java - 使用 Java 8 Streams 最大化并行度