我是新手,正在努力尝试java 8 streams + lambda。有没有人能帮我写下面这段代码?需要从列表中找到第一个人的年龄,这是可选的。此列表可以为空。
代码中缺少-列表第一个元素的null检查。我也想要这张支票。
等同于下面这段代码。
//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
}
发布于 2018-08-22 23:06:29
假设Optional
中的List
可以为空,那么您也应该考虑到这种情况。因此,最简单的方法是:
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);
发布于 2018-08-22 18:05:51
您可以使用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是否为空。
https://stackoverflow.com/questions/51972457
复制