代码之家  ›  专栏  ›  技术社区  ›  Learn Hadoop

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

  •  3
  • Learn Hadoop  · 技术社区  · 6 年前

    我以前用过:

    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).
    

    如何实现?

    2 回复  |  直到 6 年前
        1
  •  10
  •   Nikolas Charalambidis    6 年前

    您可以执行以下操作:

    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 发生在 列出<个人> ,您必须过滤 无效的 先出值:

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

    最后,如果您希望与 在特定索引上,使用 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()));
    
        2
  •  3
  •   Eugene    6 年前
    Optional<Person> firstName = 
       person.stream()
             .limit(1)
             .filter(Objects::notNull)
             .findFirst();
    

    你最好把 Optional<Person> 如果第一个元素为空,则强制使用该元素的人采取适当的操作。

    或者更简单:

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