Java 8-限制第一个对象流并转换为特定对象?

时间:2018-08-14 10:18:03

标签: java list java-8 java-stream

我以前使用过:

List<Person> person = UserDB.getUserDetails();
Person p = person.get(0); // index of first position 
System.out.println(p.getFirstName()); // sometime i am getting 
                                      // NULL pointer issue if person object is null

在Java 8中,我尝试使用map(Person::new)。是造成问题的原因。

person.stream().limit(1).map(Person::new).

如何实施?

3 个答案:

答案 0 :(得分:10)

您可以执行以下操作:

person.stream()                                              // stream
      .findFirst()                                           // finds the first
      .ifPresent(i -> System.out.println(i.getFirstName())); // if present, print the name

如果要在Person为空的情况下使用List<Person>,请使用Optional

Optional<Person> p = person.stream().findFirst();
p.ifPresent(i -> System.out.println(i.getFirstName()));

此解决方案假定列表中是否包含元素(为空)。但是,如果null中出现List<Person>,则必须先过滤掉null值:

Optional<Person> p = person.stream().filter(Objects::nonNull).findFirst();
p.ifPresent(i -> System.out.println(i.getFirstName()));

最后,如果您希望使用特定索引上的Person,请使用skiplimit。不要忘记过滤List<Person>之后的 skip-limit`否则索引将不匹配:

// person.get(3)
Optional<Person> p = person.stream().skip(3).limit(1).filter(Objects::nonNull).findFirst();
p.ifPresent(i -> System.out.println(i.getName()));

答案 1 :(得分:3)

Optional<Person> firstName = 
   person.stream()
         .limit(1)
         .filter(Objects::notNull)
         .findFirst();

如果您的第一个元素为null,则最好返回Optional<Person>,从而迫使任何使用此元素的人采取适当的措施。

或更简单:

Optional<Person> first = Optional.ofNullable(person.get(0));

答案 2 :(得分:0)

这怎么办,它也会处理空情况;

System.out.println(Optional
                .ofNullable(UserDB.getUserDetails())
                .orElse(Collections.emptyList())
                .stream()
                .map(Person::getName)
                .findFirst()
                .orElse(null));