首页 > 解决方案 > 使用 Stream 从文件中逐字存储

问题描述

我正在学习使用 Stream,并尝试在没有 Scanner.hasNext() 的文件中获取所有包含元音且单词长度大于 4 的单词。

文件中的示例文本

对于文件的示例,我想编写如下代码

Stream<String> text = Files.lines(Paths.get(example.txt));
List<String> result = text.filter(w->w.length()>4)
.filter(w -> w.contains("a")||w.contains("e")||
w.contains("i")||w.contains("o")||w.contains("u")).collect(Collectors.toList());
System.out.println(result);

我想要得到的输出是

There bunch vowels example vowel 

但它返回与文本相同的字符串。

我所知道的是使用 Stream 在文本文件中逐行读取,但我想让它逐字读取(或从每一行拆分字符串。)

有人请帮帮我吗?

标签: javastream

解决方案


您可以尝试以下代码段

List<String> result = Files.lines(Paths.get("/tmp/examples.txt"))
                                   .flatMap(line -> Arrays.stream(line.split("\\W+")))
                                   .filter(w -> w.length() > 4)
                                   .filter(w -> w.matches(".*[aeiou].*"))
                                   .collect(Collectors.toList());

System.out.println(result);

正则表达式拆分单词:: "\\W+"一个或多个非单词字符序列。

注意:
这种方法的问题是单词foo'sbar会被分成 2 个单词foosbar. 如果要排除'作为拆分器,可以使用模式[\W&&[^']]+。请以这种方式在表达式中包含所有有效字符。

输出:

[There, bunch, vowels, example, vowel]

推荐阅读