【问题标题】:Java 8 - limiting stream of first object and convert to specific object?Java 8 - 限制第一个对象的流并转换为特定对象?
【发布时间】:2018-08-14 10:18:02
【问题描述】:

我之前用过:

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

我该如何实施?

【问题讨论】:

  • 为什么要使用流呢?应该是.map(Person::getFirstName).forEach(System.out::println)
  • 那么,您的问题是什么? UserDB.getUserDetails() 在列表中返回空元素?
  • 如果List 中的第一个Personnull,您可以使用Optional 方法返回一个空的Person - 假设您正在尝试这样做。从上下文看不是特别清楚。
  • 我需要从列表中获取第一人称对象以进行进一步处理。这里我只是打印。
  • 为什么null 对象首先被放入列表中?这意味着什么?也许不应该。

标签: java list java-8 java-stream


【解决方案1】:

您可以执行以下操作:

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

如果您想在List&lt;Person&gt; 为空的情况下使用Person,请使用Optional

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

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

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

最后,如果您希望在特定索引上使用Person,请使用skiplimit。不要忘记过滤List&lt;Person&gt; 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()));

【讨论】:

    【解决方案2】:
    Optional<Person> firstName = 
       person.stream()
             .limit(1)
             .filter(Objects::notNull)
             .findFirst();
    

    如果你的第一个元素为空,你最好返回一个Optional&lt;Person&gt;,从而强制使用它的人采取适当的行动。

    甚至更简单:

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

    【讨论】:

    • @感谢 Eugene 的解决方案
    • @Eugene:第二种“更简单”的方式将抛出java.lang.ArrayIndexOutOfBoundsException: 0,以防List&lt;Person&gt; person 没有元素(为空)。
    • @Nikolas 当然,但这不是 OP 的问题
    • 还要注意,在这里使用函数式风格是多余的,OP 最好坚持使用原始的命令式代码并添加空检查。
    • @Eugene:就 OP 是初学者而言,他不知道这应该是他/她关心的问题。这至少是警告他的好方法。
    【解决方案3】:

    这样怎么样,它也会处理空场景;

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多