Java 8 - 获取 CustomizedObject 中列表的第一个元素 Optional<CustomizedObject>

4

我不确定如何做这件事

class Department {
    String deptName;
    List<Person> employees;
}

class Person {
    String personName;
}

问题陈述是获取在特定部门工作的人的名字。这个部门可以是可选的。所以我的方法如下 -
String getFirstPerson(Optional<Department> department, String defaultName) {
// TODO: 
}

我知道传统的做法,但是想看看一些Java 8 + lambda的方法来简化这个过程。

我还有一个默认名称可以在找不到该值时使用。

注:我知道将Optional作为方法参数不是最佳实践。这不是实际代码。我只是试图简化它。

3个回答

2

您可以在 Optional 上使用 map 函数获取员工列表,然后使用 stream 获取第一个名字或返回 defaultName。即使 Optional 为空,您也将获得 defaultName

String getFirstPerson(Optional<Department> department, String defaultName) {

   return department.map(d->d.getEmployees().stream().map(Person::getPersonName).findFirst().orElse(defaultName)).orElse(defaultName));
}

如果您遇到在getEmployees上获取null的情况,可以使用以下方法:
department.map(Department::getEmployees)
          .filter(Objects::nonNull)
          .map(emp->emp.stream().map(Person::getPersonName).findFirst().orElse(defaultName)).orElse(defaultName)

1

一个简化的方法是对于不存在的部门使用emptyList或可空的employees

String getFirstPerson(Optional<Department> department, String defaultName) {
    return department.map(Department::getEmployees)
            .orElse(Collections.emptyList()) // get rid of this ensuring non null List
            .stream()
            .map(Person::getPersonName)
            .findFirst()
            .orElse(defaultName);
}

注意:这样可以避免在标记答案中两次使用 orElse(defaultName) - Naman

1

实际上在:

department.map(Department::getEmployees)
          .filter(Objects::nonNull)
          .map(emp->emp.stream().map(Person::getPersonName).findFirst().orElse(defaultName)).orElse(defaultName)

我们不需要检查非空,因为.map(Department::getEmployees)如果员工为空将返回Optional.empty()。请参阅 Optional文档。正确的答案应该是没有冗余过滤器:

department.map(Department::getEmployees)
          .map(emp->emp.stream().map(Person::getPersonName).findFirst().orElse(defaultName)).orElse(defaultName)

或者,另一种选择是:
department.map(Department::getEmployees)
          .map(List::stream)
          .map(Stream::findFirst)
          .flatMap(Functions.identity())
          .map(Person::getPersonName)
          .orElse(defaultName);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接