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

如何在Java8中使用stream过滤两个list对象并将值设置为新的list

景宏富
2023-03-14

我使用Java8和我有两个对象看起来像:

Person类:

public class Person {

    private String id;
    private String name;

    public Person() {
    }

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

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}
public class Person1 {
    private String id;
    private String name;

    public Person1() {
    }

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

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Person1{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}
 List<Person> persons= Arrays.asList(new Person("1","A"),new Person("2","B"));
  List<Person1> persons1 = Arrays.asList(new Person1("3","C"),new Person1("1","F"));

现在我想使用StreamJava8循环两个列表和比较。如果list persons中的任何对象等于persons1,我将创建新的list并设置新的值。例如:如果Person1(“1”,“F”)等于Person1(“1”,“A”),因为我使用id进行比较,我将Person1的名称设置为Person1。结果:Person(“1,”F“)并添加它两个新的列表。

我使用for时的代码:

 for (Person person : persons) {
            for (Person1 person1 : persons1 ) {
                if (person1.getId().equals(person.getId())) {
                    person.setName(person1.getId());
                    break;
                }
            }
        }

现在我想把它转换成流,新的列表看起来像:

 List<Person> personList =
                list.stream()
                        .filter (
                                person -> list1.stream()
                                        .anyMatch(person1 -> person1.getId()== person.getId()))
                        .collect(Collectors.toList());

共有1个答案

阚夕
2023-03-14

有些任务最好通过流来完成,有些任务最好通过迭代来完成。结合这两种方法可以最好地完成许多任务。在该解决方案中,使用流来构造映射,然后使用迭代来更新匹配的人名。您的解决方案以二次时间运行,而此解决方案以线性时间复杂度运行。

Map<String, String> idToNameMap = persons1.stream()
    .collect(Collectors.toMap(Person1::getId, Person1::getName, (a, b) -> a));
for (Person person : persons) {
    if (idToNameMap.containsKey(person.getId())) {
        person.setName(idToNameMap.get(person.getId()));
    }
}
 类似资料:
  • 我有以下几门课: 我有一个a的列表,我想将其转换为具有以下逻辑的映射: 在一行流方法中做它的最好方法是什么? 谢谢Elad

  • 我有V类的对象列表,我想创建一个相同V类的新对象。List中对象的一些属性在列表中是相同的,一些属性具有不同的值。我想创建新的对象V,它们具有公共属性,并且具有不同值的属性应该被求和并设置为对象V。 例如 我有如下列表。 我想要新的Sample对象,其值为 我怎样才能做到这一点?

  • 问题内容: 我有一个像这样定义的Django Form类: 这项工作正常,但有一些限制,我似乎无法解决: (1)我想基于传递给表单的变量在queryset上使用过滤器,如下所示: 当然,这在模型中不起作用,因为不能将其作为变量传递。 因此,必须以某种方式在中定义必须,但据我所知,它是Form类中的必填字段。 (2)我想对数据库中的对象进行默认选择,可以这样选择: 我尝试将adminuser指定为表

  • 问题内容: 尝试查看是否有任何JavaScript库功能可以合并两个json对象的特定键的值 使用$ .extend和$ .merge给出以下结果 我正在寻找的是 问题答案: 您想深入扩展

  • 我有一个map对象,它由key作为字符串和value作为字符串列表组成,我所需要做的就是用JSTL迭代这个列表 例如; 我如何在JSTl中对list对象进行ITEART,并检查上面的条件。请提供建议。

  • 我有列表: 如何转换列表 需要更换: 对象具有构造函数: 我试过这个: 但这对我不起作用。我得到错误: 我认为lambda参数是数组的点[],但不是。