可选的<list> Java 8 Lambda表达式获取第一个元素

时间:2018-08-22 17:44:51

标签: lambda java-8 java-stream optional

我是这里的新手,并通过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
}

3 个答案:

答案 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来处理

  

缺少代码-空检查列表的第一个元素。还要进行此检查。