TFu*_*uto 3 java-8 java-stream
我有以下文件格式:
Text1
+ continuation of Text1
+ more continuation of Text1
Text2
+ continuation of Text2
+ more continuation of Text2
+ even more continuation of Text2
Run Code Online (Sandbox Code Playgroud)
延续标记为\n+
.(换行符,加上字符,空格作为三个字符的字符串.)Continuations可以是任意数量的行,包括0.
我想要以下输出(每个是打印的行.forEach
):
Text1 continuation of Text1 more continuation of Text1
Text2 continuation of Text2 more continuation of Text2 even more continuation of Text2
Run Code Online (Sandbox Code Playgroud)
我想只使用Java流来进行转换,最好是使用Collect.有没有办法优雅地做到这一点?
编辑:
另一个更现实的例子:
Lorem ipsum dolor sit amet, consectetur
+ adipiscing elit, sed do eiusmod tempor incididunt
+ ut labore et dolore magna aliqua. Ut enim ad minim veniam,
+ quis nostrud exercitation ullamco laboris nisi ut aliquip ex
+ ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit
+ esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
+ occaecat cupidatat non proident, sunt in culpa qui officia
+ deserunt mollit anim id est laborum.
Run Code Online (Sandbox Code Playgroud)
预期结果是两行:
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Run Code Online (Sandbox Code Playgroud)
在Java 9中,您可以使用
static final Pattern LINE_WITH_CONTINUATION = Pattern.compile("(\\V|\\R\\+)+");
Run Code Online (Sandbox Code Playgroud)
...
try(Scanner s = new Scanner(file)) {
s.findAll(LINE_WITH_CONTINUATION)
.map(m -> m.group().replaceAll("\\R\\+", ""))
.forEach(System.out::println);
}
Run Code Online (Sandbox Code Playgroud)
由于Java 8缺少该Scanner.findAll(Pattern)
方法,因此您可以添加该操作的自定义实现作为解决方法
public static Stream<MatchResult> findAll(Scanner s, Pattern pattern) {
return StreamSupport.stream(new Spliterators.AbstractSpliterator<MatchResult>(
1000, Spliterator.ORDERED|Spliterator.NONNULL) {
public boolean tryAdvance(Consumer<? super MatchResult> action) {
if(s.findWithinHorizon(pattern, 0)!=null) {
action.accept(s.match());
return true;
}
else return false;
}
}, false);
}
Run Code Online (Sandbox Code Playgroud)
可以使用像
try(Scanner s = new Scanner(file)) {
findAll(s, LINE_WITH_CONTINUATION)
.map(m -> m.group().replaceAll("\\R\\+", ""))
.forEach(System.out::println);
}
Run Code Online (Sandbox Code Playgroud)
这将使未来的迁移变得容易.
归档时间: |
|
查看次数: |
576 次 |
最近记录: |