我不知道该怎么做class Department { String deptName; List<Person> employees;}class Person { String personName;}问题陈述是获取在特定部门工作的人员的名字。该部门可以是可选的。这就是我的方法的样子 -String getFirstPerson(Optional<Department> department, String defaultName) {// TODO: }我知道执行此操作的传统方法,但希望看到一些 Java 8 + lambda 方法来简化此操作。这里仍然是新手 - 所以如果我没有使用正确的格式,请原谅。我还有一个默认名称可以使用,以防我们找不到该值。PS 我知道将Optional 作为方法参数发送不是最佳实践。这不是实际的代码。我只是想简化它。
3 回答
侃侃无极
TA贡献2051条经验 获得超10个赞
您可以使用map
on 函数Optional
获取员工列表,然后使用stream
get the name 或 return defaultName
。即使 ifOptional
为空,您也会得到 defaultName
String getFirstPerson(Optional<Department> department, String defaultName) { return department.map(d->d.getEmployees().stream().map(Person::getPersonName).findFirst().orElse(defaultName)).orElse(defaultName)); }
如果您有机会上null
车getEmployees
,可以使用以下方法
department.map(Department::getEmployees) .filter(Objects::nonNull) .map(emp->emp.stream().map(Person::getPersonName).findFirst().orElse(defaultName)).orElse(defaultName)
湖上湖
TA贡献2003条经验 获得超2个赞
一种简化的方法可以用于emptyList
缺勤部门或 nullable 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); }
慕哥9229398
TA贡献1877条经验 获得超6个赞
实际上在:
department.map(Department::getEmployees) .filter(Objects::nonNull) .map(emp->emp.stream().map(Person::getPersonName).findFirst().orElse(defaultName)).orElse(defaultName)
我们不必检查非空,因为如果员工为空则.map(Department::getEmployees)
返回。正确的答案是没有冗余过滤器:
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);
添加回答
举报
0/150
提交
取消