我正在学习使用
Stream<String>
,并尝试在没有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<String>
在文本文件中逐行读取,但我想让它逐字读取(或从每行中分割字符串。)
我该怎么做?
您可以尝试下面的代码片段
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]