【发布时间】:2017-10-19 02:38:55
【问题描述】:
我有以下两个课程:
Person:
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 -
Person的address和phone分别合并到CollectivePerson中的addresses和phones,对于所有具有相同id的Persons
我为此编写了以下代码:
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]]
但我相信可能有更好的方法,即流式分组方式来实现相同的效果。任何指针都会很棒。
【问题讨论】:
标签: java lambda java-8 java-stream