代码之家  ›  专栏  ›  技术社区  ›  uma

如何将以下方法转换为Java8?

  •  8
  • uma  · 技术社区  · 6 年前

    我有一个List对象,如果列表中的第一个元素不是null或空的,我需要它。

    我使用java编写以下代码,现在我想将其转换为Java8。

        List<DD> container
        A<DD,DI> a;
        if(container!=null || !container.isEmpty()){
           for(DD dd:container)
           {
              a = dd.getPrescription();
              break;
           }
        }
    

    我把它转换成这样。

     DD detail = container.stream().findFirst().get();
    

    我需要知道这是正确的?

    4 回复  |  直到 6 年前
        1
  •  9
  •   Naman    6 年前

    您当前的代码中存在一个严重缺陷,即。

    if(container!=null || !container.isEmpty())
    

    这仍然可以抛出一个错误 NullPointerException (何时) container == null ),除非条件运算符更改为 && . 下面的实现将是我建议的。


    DD detail = container.stream().findFirst().orElse(null); // or some default value instead of 'null'
    

    如果 container 本身可以为null,请使用

    DD detail = container != null ? 
                    container.stream().findFirst().orElse(null) : null;
    

    如果您需要此对象的处方,请使用 map 作为:

    container.stream().findFirst().map(DD::getPrescription).orElse(null)
    //                               ^^
    //                               return type of prescription then
    

    使用Java-9,这可能会简单得多,因为:

    A<DD, DI> basePrescription = Stream.ofNullable(container) // Java-9 API
                                       .flatMap(List::stream)
                                       .findFirst()
                                       .map(DD::getPrescription)
                                       .orElse(null);
    
        2
  •  5
  •   xehpuk    6 年前

    这更简单:

    A<DD,DI> a = container.get(0).getPrescription();
    

    虽然这是对原始代码的直接翻译,但您可能打算这样做:

    A<DD,DI> a = container != null && !container.isEmpty()
        ? container.get(0).getPrescription()
        : null;
    
        3
  •  4
  •   Ousmane D.    6 年前

    从JDK9开始,有一种新的方法 T requireNonNullElse(T obj, T defaultObj) 如果第一个参数为非null,则返回第一个参数,否则返回非null的第二个参数。

    Objects.requireNonNullElse(container, Collections.emptyList())
           .stream()
           .findFirst()
           .map(DD::getPrescription);
    

    这将返回一个 Optional<T> 哪里 T 是什么类型的 getPrescription .orElse(null); 获取可选项包含的值,或者 null 值,但在 可选<T> API,您可能会发现它在从可选对象提取值时更有用。

        4
  •  1
  •   SumiSujith    6 年前
    The findFirst() method finds the first element in a Stream. This method is used when you specifically want the first element from a sequence.
    
    a) container.stream().findFirst().orElse(null);
    b) container.stream().filter(Objects::nonNull).findFirst().orElse(null);
    c)container.stream().filter(StringUtils::isNotBlank).findFirst();
    or as lambdas:
    d)container.stream().filter(s -> StringUtils.isNotBlank(s)).findFirst();
    
    e)container.stream().filter(StringUtils::isNotBlank).findFirst()
    

    供参考:- http://www.geekabyte.io/2015/01/using-optional-effectively-in-java-8.html