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

Lea*_*oop 3 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
Run Code Online (Sandbox Code Playgroud)

在Java 8中,我尝试过map(Person::new).它导致了这个问题.

person.stream().limit(1).map(Person::new).
Run Code Online (Sandbox Code Playgroud)

我该如何实施?

Nik*_*las 10

您可以执行以下操作:

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

如果您想使用Person以防万一List<Person>,请使用Optional:

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

此解决方案假定列表中包含元素(是空的).但是如果null发生在List<Person>,则必须首先过滤null掉值:

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

最后,如果您希望Person使用特定索引,请使用skiplimit.不要忘记过滤List<Person> after 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()));
Run Code Online (Sandbox Code Playgroud)