java 8 stream从类型A的集合创建类型B的集合

时间:2017-04-10 04:47:13

标签: java collections java-8 java-stream

我想使用流来创建类型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的集合。

3 个答案:

答案 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