我想使用流来创建类型B的类型A的集合。
假设我有两个班级
Class Employee{
String firstName;
String lastName;
int age;
String id;
String email;
double salary;
}
Class Person {
String firstName;
String lastName;
String email;
}
要从Employee的集合创建Person的集合,我正在编写以下代码
public static List<Person> createPersonsFromEmployees(List<Employee> employees) {
List<Person> persons = new ArrayList<>();
employees.stream().filter(Object :: nonNull)
.forEach(e -> {
persons.add(new Person(e.getFirstName(),
e.getLastName(),
e.getEmail());
};)
return persons;
}
目前,这段代码有效。但我想知道并且想知道是否有更好的方法可以在不使用Person
的情况下从Employee
创建forEach
的集合。
答案 0 :(得分:7)
这是一种更清洁的方式。在流中使用.forEach()表示可能有更好的方法来使用Stream。流意味着功能性,它们试图远离可变性。
func willPresentSearchController(_ searchController: UISearchController) {
searchController.searchBar.setValue("", forKey:"_cancelButtonText")
}
答案 1 :(得分:3)
创建适配器类:
class EmployeeToPersonAdapter {
private EmployeeToPersonAdapter() {
}
public static Person toPerson(Employee employee) {
if (employee == null) {
return null;
}
return new Person(employee.getFirstName(),
employee.getLastName(),
employee.getEmail());
}
}
然后使用它:
public static List<Person> createPersonsFromEmployees(List<Employee> employees) {
return employees.stream()
.filter(Objects::nonNull)
.map(EmployeeToPersonAdapter::toPerson)
.collect(Collectors.toList());
}
答案 2 :(得分:2)
将Employee
映射到Person
您可以使用其他人已提供的Collectors.mapping / Stream.map,因此我会跳过它。
注意映射方式比map然后收集方式快,因为collect(mapping(...))
是O(N)但map(...).collect(...)
是O(2N),但map(...).collect(...)
比{{1}更可读}}和collect(mapping(...))
引用公开的mapping
方法引用,而不是transform(Employee)
,它将被重复用作将Function<Employee,Person>
转换为Employee
的方法。然后两个Person
方法具有相同的语义,它们都是adapter方法。
transform