为了账号安全,请及时绑定邮箱和手机立即绑定

可选<CustomizedObject> 获取CustomizedObject 中列表的第一个元素

可选<CustomizedObject> 获取CustomizedObject 中列表的第一个元素

一只名叫tom的猫 2023-09-13 17:16:53
我不知道该怎么做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个赞

您可以使用mapon 函数Optional获取员工列表,然后使用streamget 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));
}

如果您有机会上nullgetEmployees,可以使用以下方法

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


查看完整回答
反对 回复 2023-09-13
?
湖上湖

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);
}


查看完整回答
反对 回复 2023-09-13
?
慕哥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);


查看完整回答
反对 回复 2023-09-13
  • 3 回答
  • 0 关注
  • 117 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信