Java流API.在一行中查找匹配谓词的对象的字段.如果不存在,则返回一些默认值

sce*_*aph 5 java optional java-stream

例如,我们有一个带有一些字段的简单类.我们假设,我们有名为'name'和'id'的字段.我想获取具有指定id的对象的名称,如果没有这样的对象,则返回一些defaultName:

private List<MyObject> myObjects;
public String findFieldById(int id) {
    MyObject matchingObj = myObjects.stream()
                    .filter(m -> m.getId() == id)
                    .findFirst().orElse(null);

    return (matchingObj == null) ? "defaultName" : matchingObj.getName();
}
Run Code Online (Sandbox Code Playgroud)

我的问题是如何在一行中轻松地对流中的 null进行检查?

Ous*_* D. 7

您可以在一个管道通过映射来执行这种类型的操作MyObject::getName之后findFirst,否则通过提供一个默认值orElse.

return myObjects.stream()
         .filter(m -> m.getId() == id)
         .findFirst()
         .map(MyObject::getName)
         .orElse("defaultName");
Run Code Online (Sandbox Code Playgroud)

  • 请记住,当`myObject.getName()`产生`null`时,这将返回``defaultName`` (2认同)
  • @Lino可以通过使用`.map(MyObject :: getName).findFirst().orElse("defaultName")来修复.由于流的惰性,这仍然只会在第一个匹配元素上调用`getName`,如果有的话,但是现在,如果调用`getName()`返回`null,则会出现`NullPointerException` `.这与你的解决方案不同,它只返回`null`,但对我来说,如果没有匹配的话,应该提供一个``defaultName``的方法似乎不应该在任何情况下返回`null`. (2认同)