当前位置: 首页 > 知识库问答 >
问题:

Java 8流-合并两个集合,按特定字段保持其唯一[duplicate]

东郭弘
2023-03-14

这是我在java中所能做的最好的操作,但它收集的是唯一的名称,而不是狗:
(狗包含除名称以外的其他字段)

// collect all dogs names from first list
List<String> dogNames1 = dogsList1.stream()
     .map(x -> x.getName()).collect(Collectors.toList()); 

dogList2.stream()
     .filter(x->!dogNames1.contains(x.getName()))
     .forEach( x->
            dogsList1.add(x);
     );

还能改进吗?还有其他更好的解决方案或优化方法吗?

共有1个答案

薄烨
2023-03-14

可以使用“合并多个流”和“删除重复项”。

对于一个给定名字的第一只狗,你可以做

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class A {

    public static void main(String[] args) {
        List<Dog> dogList1 = Arrays.asList(new Dog("a", 1), new Dog("b", 2), new Dog("f", 3));
        List<Dog> dogList2 = Arrays.asList(new Dog("b", 4), new Dog("c", 5), new Dog("f", 6));
        List<Dog> dogList3 = Arrays.asList(new Dog("b", 7), new Dog("d", 8), new Dog("e", 9));
        List<Dog> dogs = new ArrayList<>(
                Stream.of(dogList1, dogList2, dogList3)
                        .flatMap(List::stream)
                        .collect(Collectors.toMap(Dog::getName,
                                d -> d,
                                (Dog x, Dog y) -> x == null ? y : x))
                        .values());
        dogs.forEach(System.out::println);
    }
}

class Dog {
    String name;
    int id;

    public Dog(String name, int id) {
        this.name = name;
        this.id = id;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", id=" + id +
                '}';
    }
}

印刷品

Dog{name='a', id=1}
Dog{name='b', id=2}
Dog{name='c', id=5}
Dog{name='d', id=8}
Dog{name='e', id=9}
Dog{name='f', id=3}
Set<String> names = Stream.of(dogList1, dogList2, dogList3)
                          .flatMap(List::stream)
                          .map(Dog::getName)
                          .collect(Collectors.toSet());
 类似资料:
  • 我有两个(或更多)

  • 我如何合并两组对象,如果Set1中的一个对象具有匹配的和作为Set2中的一个对象,那么在合并后的集合中只保留Set2中的一个。 例如。 Set1: Set2: 生成的合并集:(顺序无关紧要) 我可以联合这两个集合但我不知道如何利用Java8流添加此过滤条件

  • 需要帮助的一个案件流与分组由我希望能够分组由2个不同的字段,并有其他大小数字段的总和,根据不同的分组。以下是我的实体: 让我们假设我有以下列表作为输入: 下面有一个解决方案的开头,但我在添加第二个聚合来总结余额的时候阻止了:

  • 有没有办法把下面的2个状态结合起来呢? 我有一个类如下所示: 包含一个介于之间的随机值。 是一个包含大量

  • 本文向大家介绍Java中合并两个集合的方法,包括了Java中合并两个集合的方法的使用技巧和注意事项,需要的朋友参考一下 要在JAVA中合并两个集合,代码如下所示的− 示例 输出结果 名为Demo的类包含名为“set_merge”的函数,该函数使用“addAll”函数合并作为参数传递给函数的两个集。 在main函数中,定义了两个集合,并使用‘addAll’函数将元素添加到其中。 控制台上会打印相关消

  • 本文向大家介绍分组字符合并SQL语句 按某字段合并字符串之一(简单合并),包括了分组字符合并SQL语句 按某字段合并字符串之一(简单合并)的使用技巧和注意事项,需要的朋友参考一下 标题:按某字段合并字符串之一(简单合并) 描述:将如下形式的数据按id字段合并value字段。 id    value ----- ------ 1     aa 1     bb 2     aaa 2     bbb