Java 在ArrayList中获取多个单词<;字符串>;从使用流的字符串消息

Java 在ArrayList中获取多个单词<;字符串>;从使用流的字符串消息,java,list,java-stream,Java,List,Java Stream,问题:在给定使用流/并行流的单词列表的情况下,是否有一种有效的方法返回消息中显示的字符串列表 假设我有“ArrayList banWords”,其中包含玩家不能说的单词列表。现在让我们假设“message”表示玩家键入的消息。我如何检查“message”是否包含“banWords”中的任何单词,如果是,使用Stream返回“message”中出现的所有单词 我之所以问这个问题,是因为我对Stream不太熟悉,也没有找到一个过去曾被问过的合适的问题。目前,代码循环遍历“banWords”中的每个单

问题:在给定使用流/并行流的单词列表的情况下,是否有一种有效的方法返回消息中显示的字符串列表

假设我有“ArrayList banWords”,其中包含玩家不能说的单词列表。现在让我们假设“message”表示玩家键入的消息。我如何检查“message”是否包含“banWords”中的任何单词,如果是,使用Stream返回“message”中出现的所有单词

我之所以问这个问题,是因为我对Stream不太熟悉,也没有找到一个过去曾被问过的合适的问题。目前,代码循环遍历“banWords”中的每个单词,并检查“message”是否包含该单词。如果是这样,它将被添加到一个单独的ArrayList中

for (String word: banWords)
    if (message.contains(word))
        // Adds word to a separate arraylist

然而,我试图看看是否有一种方法可以使用流或并行流来返回单词。这是我找到的最接近的

if (banWords.parallelstream().anyMatch(message::contains) {
    // Adds the word to another list using banWords.parallelstream().filter(message::contains).findAny().get()
}
但是,这只返回banWords中出现的最后一个单词。例如,如果banWords包含“hello”和“hey”,并且消息是“hello hey”,而不是添加“hello”和“hey”作为两个单独的单词,那么它只会添加“hey”


关于如何有效地获取消息中的单词列表,有什么想法吗?在这一点上,我正在寻找最有效或最快速的方法,如果您有另一种方法,不使用流,我很乐意听到。

假设您有一个字符串
ArrayList banWords
,然后使用该字符串创建流,并使用
filter
筛选包含
banWords

List<String> list = Stream.of("ArrayList banWords").filter(s->s.contains("banWords"))
                                                   .collect(Collectors.toList());
List List=Stream.of(“ArrayList banWords”).filter(s->s.contains(“banWords”))
.collect(Collectors.toList());
您还可以使用多个字符串创建流

List<String> list = Stream.of("ArrayList banWords","Set banWords", "map").filter(s->s.contains("banWords"))
                                                   .collect(Collectors.toList());
List List=Stream.of(“ArrayList banWords”、“Set banWords”、“map”)。过滤器(s->s.contains(“banWords”))
.collect(Collectors.toList());
这就是你需要做的

List<String> list = word.stream().
                        .filter(s->message.contains(s))
                        .collect(Collectors.toList());
List List=word.stream()。
.filter->message.contains
.collect(Collectors.toList());
message.stream().filter->bannedWordSet.contains().collect(Collectors.toList())


需要注意的是,在你的禁词列表中使用集合而不是列表是很重要的。这样会更有效率。

您可以在
filter()之后收集到列表。


每当我开始在IntelliJ中键入“message.stream()”时,都不会弹出任何消息…如果我使用一个集合,它的.contains方法更有效,那么使用并行流有什么意义吗?@FrankW。是的,它们是不同的概念。尽管如此,假设您不是一次处理数千个单词,那么就没有理由使用并行流。在小型数据集上,并行化没有任何作用。一个集合比一个列表更有效,因为它的常量时间包含而不是O(n),我读到集合使用的内存是列表的5.5倍。如果目标是保存内存,那不是意味着我应该切换到ArrayList吗?我正在为我的朋友编写一些代码,我只是想把它做好……一般来说,记忆远不如速度重要。但正如我所说,对于小案件来说,这无关紧要。一般来说,是的,这是对内存的优化。速度,但是在99%的情况下,你会选择速度。有没有一种方法可以获取每个单词并用另一个单词自动替换它?我还想了解更多关于parallel和parallelstream的知识。我可以从哪里开始?我现在有一个迭代器,但我想看看是否还有其他方法
List foundWords = banWords.parallelstream().filter(message::contains).collect(Collectors.toList());