使用 Stream 逐字处理文件<T>

问题描述 投票:0回答:1

我正在学习使用

Stream<String>
,并尝试在没有
Scanner.hasNext()
的文件中获取所有包含元音且单词长度大于4的单词。

example text in a file

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

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<String>
在文本文件中逐行读取,但我想让它逐字读取(或从每行中分割字符串。)

我该怎么做?

java java-stream nio
1个回答
3
投票

您可以尝试下面的代码片段

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 个单词
foo
sbar
。如果您想排除
'
作为拆分器,您可以使用模式
[\W&&[^']]+
。请以这种方式在表达式中包含所有有效字符。

输出:

[There, bunch, vowels, example, vowel]
© www.soinside.com 2019 - 2024. All rights reserved.