仅返回 Java 流中的真实谓词 [重复]

Posted

技术标签:

【中文标题】仅返回 Java 流中的真实谓词 [重复]【英文标题】:Return only true predicates in Java stream [duplicate] 【发布时间】: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 模式的问题。 【参考方案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);

【讨论】:

以上是关于仅返回 Java 流中的真实谓词 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

有条件地从Java 8中的List中删除元素[重复]

有条件地从 Java 8 中的列表中删除元素 [重复]

Java 8 流中的 LINQ Enumerable.Single() [重复]

从 C# 中的 WebSocket 流中读取整个字符串 [重复]

NSFetchedResultsController OR 谓词在 iOS6 上为某些项目返回重复项

检查数组中的重复条目,但仅返回重复的值 [重复]