为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

海绵宝宝撒 2023-03-23 13:36:45
我使用 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 + '\'' +                '}';    }}人 1 类: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 循环两个列表并进行比较。如果列表 persons 中的任何对象等于 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;                }            }        }
查看完整描述

2 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

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


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

    }

}


查看完整回答
反对 回复 2023-03-23
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

这不是最漂亮的答案等等,但我想它会帮助你了解它是如何工作的。


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


查看完整回答
反对 回复 2023-03-23
  • 2 回答
  • 0 关注
  • 145 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信