java-8 - 发出流的 Java 8 流

标签 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

继续由 \n+ 标记. (换行符、加号、空格作为三个字符的字符串。)续行可以是任意行数,包括 0。

我想要以下输出(每个都是用 .forEach 打印的一行):
Text1 continuation of Text1 more continuation of Text1 
Text2 continuation of Text2 more continuation of Text2 even more continuation of Text2

我只想使用 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.

预期结果是两行:
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.

最佳答案

在 Java 9 中,您可以使用

static final Pattern LINE_WITH_CONTINUATION = Pattern.compile("(\\V|\\R\\+)+");


try(Scanner s = new Scanner(file)) {
    s.findAll(LINE_WITH_CONTINUATION)
        .map(m -> m.group().replaceAll("\\R\\+", ""))
        .forEach(System.out::println);
}

由于 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);
}

可以像这样使用
try(Scanner s = new Scanner(file)) {
    findAll(s, LINE_WITH_CONTINUATION)
        .map(m -> m.group().replaceAll("\\R\\+", ""))
        .forEach(System.out::println);
}

这将使 future 的迁移变得容易。

关于java-8 - 发出流的 Java 8 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42961296/

相关文章:

lambda - 使用 Stream api 对多个变量进行减少和分配

Java - 8 : dynamic method arguments

java - 具有内部 ImmutableList 的映射的嵌套 groupingBy?

java - 将 foreach 转换为 Java 8 过滤流

java stream api - 将 Stream<List<Pair<A, B>>> 更改为 Pair<List<A>, List<B>>

java - 如何使用 Stream 拆分集合中的奇数和偶数以及两者的总和

float 的 Java 8 流平均值

java - 如何从 JavaFX 中的另一个 Controller 类访问 UI 元素?

java - 使用 Java 8 Streams 从列表中仅获取所需的对象

java - PropertyDescriptors 数组上 Stream 的 toMap() 函数中出现编译错误