【问题标题】:Return only true predicates in Java stream [duplicate]仅返回 Java 流中的真实谓词 [重复]
【发布时间】:2018-07-17 11:47:01
【问题描述】:

我有以下方法:

public boolean isMsgOk(String msg) {...}

我想在这里调用这个方法:

public String[] returnOkMessages(String... msgs) {
    return Arrays
        .asList(messagessgs)
        .stream(message->isMsgOk(message))
        .anyMatch() ???;
}

我想返回Strings 中的ListisMsgOk 方法返回true
我怎样才能收集它们?

【问题讨论】:

  • 注意anyMatch 返回一个booleanfirstMatch 返回一个StringtoArray 返回一个String[]
  • 我相信它是重复的。有很多关于filter+collect 模式的问题。

标签: java java-8 java-stream


【解决方案1】:

使用filter,然后使用collectList

return Arrays.asList(messagessgs)
             .stream()
             .filter(message->isMsgOk(message))
             .collect(Collectors.toList())

或:

return Arrays.stream(messagessgs)
             .filter(this::isMsgOk)
             .collect(Collectors.toList())

编辑:

如果输出应该是一个数组,使用:

return Arrays.stream(messagessgs)
             .filter(this::isMsgOk)
             .toArray(String[]::new)

【讨论】:

  • 由于“Collectors.toList()”,它无法正常工作。它说:“无法应用收集器中的 toList()”
  • @Twi 我注意到你的方法的返回类型是一个数组,而不是一个列表,所以也许你应该使用.toArray(String[]::new) 而不是.collect()
  • 我将返回类型更改为 ArrayList 但 Collectors.toList() 仍然无法正常工作。
  • @Twi 你看到了什么错误?
  • @Twi 将返回类型更改为List<String>
【解决方案2】:

将它们收集到List(您也可以使用方法引用而不是 lambda)

 .filter(this::isMsgOk)
 .toArray(String[]::new);

【讨论】:

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