gpt4 book ai didi

Java 8 Stream Mapping 分组操作

转载 作者:搜寻专家 更新时间:2023-11-01 01:31:41 25 4
gpt4 key购买 nike

我有以下两个类:

人物:

public class Person {

private final Long id;
private final String address;
private final String phone;

public Person(Long id, String address, String phone) {
this.id = id;
this.address = address;
this.phone = phone;
}

public Long getId() {
return id;
}

public String getAddress() {
return address;
}

public String getPhone() {
return phone;
}

@Override
public String toString() {
return "Person [id=" + id + ", address=" + address + ", phone=" + phone + "]";
}
}

CollectivePerson:

import java.util.HashSet;
import java.util.Set;

public class CollectivePerson {

private final Long id;
private final Set<String> addresses;
private final Set<String> phones;

public CollectivePerson(Long id) {
this.id = id;
this.addresses = new HashSet<>();
this.phones = new HashSet<>();
}

public Long getId() {
return id;
}

public Set<String> getAddresses() {
return addresses;
}

public Set<String> getPhones() {
return phones;
}

@Override
public String toString() {
return "CollectivePerson [id=" + id + ", addresses=" + addresses + ", phones=" + phones + "]";
}
}

我想进行流式操作,以便:

  • Person 映射到 CollectivePerson
  • Personaddressphone分别合并为addressesphoneCollectivePerson 中为所有具有相同 id
  • Person

我为此编写了以下代码:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;

public class Main {

public static void main(String[] args) {
Person person1 = new Person(1L, "Address 1", "Phone 1");
Person person2 = new Person(2L, "Address 2", "Phone 2");
Person person3 = new Person(3L, "Address 3", "Phone 3");
Person person11 = new Person(1L, "Address 4", "Phone 4");
Person person21 = new Person(2L, "Address 5", "Phone 5");
Person person22 = new Person(2L, "Address 6", "Phone 6");

List<Person> persons = new ArrayList<>();
persons.add(person1);
persons.add(person11);
persons.add(person2);
persons.add(person21);
persons.add(person22);
persons.add(person3);

Map<Long, CollectivePerson> map = new HashMap<>();
List<CollectivePerson> collectivePersons = persons.stream()
.map((Person person) -> {
CollectivePerson collectivePerson = map.get(person.getId());

if (Objects.isNull(collectivePerson)) {
collectivePerson = new CollectivePerson(person.getId());
map.put(person.getId(), collectivePerson);

collectivePerson.getAddresses().add(person.getAddress());
collectivePerson.getPhones().add(person.getPhone());

return collectivePerson;
} else {
collectivePerson.getAddresses().add(person.getAddress());
collectivePerson.getPhones().add(person.getPhone());

return null;
}
})
.filter(Objects::nonNull)
.collect(Collectors.<CollectivePerson>toList());

collectivePersons.forEach(System.out::println);
}
}

它的工作和输出为:

CollectivePerson [id=1, addresses=[Address 1, Address 4], phones=[Phone 1, Phone 4]]
CollectivePerson [id=2, addresses=[Address 2, Address 6, Address 5], phones=[Phone 5, Phone 2, Phone 6]]
CollectivePerson [id=3, addresses=[Address 3], phones=[Phone 3]]

但我相信可能有更好的方法,流式分组来实现相同的目的。任何指针都会很棒。

最佳答案

您可以使用 Collectors.toMap具有合并功能:

public static <T, K, U, M extends Map<K, U>>
Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction,
Supplier<M> mapSupplier)

映射看起来像这样:

Map<Long,CollectivePerson> collectivePersons =
persons.stream()
.collect(Collectors.toMap (Person::getId,
p -> {
CollectivePerson cp = new CollectivePerson (p.getId());
cp.getAddresses().add (p.getAddress());
cp.getPhones().add(p.getPhone());
return cp;
},
(cp1,cp2) -> {
cp1.getAddresses().addAll(cp2.getAddresses());
cp1.getPhones().addAll(cp2.getPhones());
return cp1;
},
HashMap::new));

您可以轻松提取 List<CollectivePerson>来自那个Map使用:

new ArrayList<>(collectivePersons.values())

这是输出 Map对于您的示例输入:

{1=CollectivePerson [id=1, addresses=[Address 1, Address 4], phones=[Phone 1, Phone 4]], 
2=CollectivePerson [id=2, addresses=[Address 2, Address 6, Address 5], phones=[Phone 5, Phone 2, Phone 6]],
3=CollectivePerson [id=3, addresses=[Address 3], phones=[Phone 3]]}

关于Java 8 Stream Mapping 分组操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46806917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com