我是这里的新手,并通过Java 8 Streams和Lambda进行尝试。有人可以帮我下面的代码吗?需要从列表中找到第一人称的年龄(可选)。该列表可以为空。
缺少代码-空检查列表的第一个元素。还要进行此检查。
等同于下面的代码。
//input parameter
//Optional<List<Person>> persons
public Integer getAgeOfFirstPerson(Optional<List<Person>> persons) {
if (!persons.isPresent()) {
return null;
}
Integer age = persons.get()
.get(0)
.getAge();
return age;
}
//Person.java
class Person {
Integer age;
//getters and setters
}
答案 0 :(得分:7)
假设List
中的Optional
为空,那么您也应该考虑这种情况。因此,最简单的方法是:
return persons.flatMap(list -> list.stream().findFirst()).map(Person::getAge).orElse(null);
不幸的是,当null
的第一个元素为findFirst()
时,NullPointerException
会引发Stream
的情况下,此操作无法处理null
的第一个列表项(如Holger在注释中注明)。
因此,如果您要跳过null
列表条目并采用第一个非空条目,请执行以下操作:
return persons.flatMap(list -> list.stream().filter(Objects::nonNull).findFirst())
.map(Person::getAge)
.orElse(null);
否则,如果您始终希望第一个条目为null
,则可以这样修改它:
return persons.flatMap(list -> list.stream().limit(1).filter(Objects::nonNull).findFirst())
.map(Person::getAge)
.orElse(null);
然而,这实际上变得相当复杂,因此,只需重新测试列表是否为空,就更简单了:
return persons.filter(list -> !list.isEmpty())
.map(list -> list.get(0))
.map(Person::getAge)
.orElse(null);
答案 1 :(得分:0)
您可以使用Optional.map
public int getAgeOfFirstPerson(Optional<List<Person>> persons){
return persons.map(people -> people.get(0).getAge()).orElse(0);
}
请注意,基元没有null
(它们不是对象),因此已将其替换为0
。
或进一步改进为answered by @Alexey,如果需要检查Person是否也为空。
答案 2 :(得分:0)
return null
是返回类型,则 int
将不会编译。假设您要缺席Optional<Integer>
,
return persons.map(list -> list.get(0)).map(Person::getAge)
将起作用(不幸的是,没有mapToInt
返回OptionalInt
就像流一样)。需要两个map
来处理
缺少代码-空检查列表的第一个元素。还要进行此检查。