繁体   English   中英

如何在java 8中使用stream过滤两个列表对象并将值设置为新的List

[英]How to using stream in java 8 filter two list object and set value to new List

我使用java 8,我有两个对象看起来像:

人员类:

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 + '\'' +
                '}';
    }
}

Person1类:

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"));

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

我使用时的代码:

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

现在我想将它转换为Stream,新列表如下所示:

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

但它只过滤人。 我想比较两个列表对象。 如果相同的id,我想要从person1中的对象设置名称到人。 我知道我们可以在流java 8中使用map但我不知道如何做到这一点。 请帮忙

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

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()));
    }
}

这不是最美丽的答案等,但我想它会帮助你了解它的工作原理。

List<Person> collect = persons.stream()
        .filter(person -> persons1.stream().anyMatch(person1 -> person1.getId() == person.getId()))
        .map(person -> {
            Person1 getted = persons1.stream()
                .filter(person1 -> person1.getId() == person.getId())
                .findAny()
                .orElseGet(null);
            if (getted == null) throw new IllegalStateException("Should be Impossible");
            person.setName(getted.getName());
            return person;
        })
        .collect(Collectors.toList());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM