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

uma*_*uma 8 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;
       }
    }
Run Code Online (Sandbox Code Playgroud)

我这样转换它.

 DD detail = container.stream().findFirst().get();
Run Code Online (Sandbox Code Playgroud)

我需要知道这是正确的吗?

Nam*_*man 9

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

if(container!=null || !container.isEmpty())
Run Code Online (Sandbox Code Playgroud)

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


它几乎是正确的,因为如果不满足条件,你需要处理一些默认值:

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

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

DD detail = container != null ? 
                container.stream().findFirst().orElse(null) : null;
Run Code Online (Sandbox Code Playgroud)

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

container.stream().findFirst().map(DD::getPrescription).orElse(null)
//                               ^^
//                               return type of prescription then
Run Code Online (Sandbox Code Playgroud)

使用Java-9,这可能更简单:

A<DD, DI> basePrescription = Stream.ofNullable(container) // Java-9 API
                                   .flatMap(List::stream)
                                   .findFirst()
                                   .map(DD::getPrescription)
                                   .orElse(null);
Run Code Online (Sandbox Code Playgroud)

  • 我觉得目前使用Java-8和"null"的可能性并不多.虽然编辑过包括一个更干净的java-9解决方案. (2认同)
  • @uma如果它的空是要跟随的分支将是`container.stream()...`没有元素因此`findFirst`返回`Optional.empty`因此`orElse(null)`进入图片...简而言之它会返回`null`. (2认同)

xeh*_*puk 5

这样更容易:

A<DD,DI> a = container.get(0).getPrescription();
Run Code Online (Sandbox Code Playgroud)

虽然这是您原始代码的直接翻译,但您可能想要这样的内容:

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