如何将以下方法转换为Java 8?

时间:2019-01-03 03:34:39

标签: java lambda java-8 java-stream

我有List对象,并且如果列表中的第一个元素不为null或为空,则需要使用它。

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

    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 个答案:

答案 0 :(得分:9)

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

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

除非条件运算符更改为NullPointerException,否则它仍然可以抛出container == null(在&&时)。发布下面的实现将是我建议遵循的。


从条件上讲,如果不满足条件,您需要处理一些默认值:

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

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

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

答案 1 :(得分:5)

这更容易:

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

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

A<DD,DI> a = container != null && !container.isEmpty()
    ? container.get(0).getPrescription()
    : null;

答案 2 :(得分:2)

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

因此,我们可以将您的代码简化为:

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

这将返回一个Optional<T>,其中TgetPrescription的任何类型。根据上下文以及是否合适,您可能要使用.orElse(null);来获取可选包含的值,或者使用null值,但是Optional<T> API中还有其他几种方法从可选值中提取值时,您可能会发现更有用。

答案 3 :(得分:1)

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