当前位置: 首页 > 知识库问答 >
问题:

发出流的Java 8流

董和风
2023-03-14
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.

共有1个答案

孔波
2023-03-14

在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);
}
 类似资料:
  • 问题内容: 我有以下文件格式: 连续标记为\n+。(换行符,加字符,空格作为三个字符串。)连续行可以是任意数量的行,包括0。 我想要以下输出(每行都是印有的行.forEach): 我只想使用Java流进行转换,最好使用Collect。有没有办法优雅地做到这一点? 编辑: 另一个更现实的示例: 预期结果为两行: 问题答案: 在Java 9中,您可以使用 由于Java 8缺少该方法,因此您可以添加操作

  • 产出: 请提供2个方法将产生不同输出的例子。

  • 如果我的API提供了一个流,客户端是否有办法修改基础集合? 例如: 客户端是否可以调用并以某种方式修改的内容?

  • 我在流中使用分组: 1:我想知道如何在Collect方法中使用“Grouping By”两次。 2:其次,在分组中定义退货类型的策略是什么? 1: 错误消息: 1:线程“main”java中出现异常。RuntimeException:不可编译的源代码-不兼容的类型:推理变量D具有不兼容的等式约束。字符串,java。lang.Integer在collectorsinjava。收藏家辛加瓦。main(

  • 1 Java8 Stream流式编程的介绍 Java在Java 8中提供了一个新的附加程序包,称为java.util.stream。该软件包由类,接口和枚举组成,以允许对元素进行功能样式的操作。您可以通过导入java.util.stream包来使用流。 Stream提供以下功能: 流不存储元素。它只是通过计算操作的流水线从数据结构,数组或I/O通道等源中传递元素。 流本质上是功能性的。对流执行的操

  • 使用以下代码,我得到以下编译错误。我还尝试使用输入作为整数列表,而不是int[],这样做效果很好。如果我使用box(),它也可以正常工作。 我的问题真的是如果Int Stream必须是整数流,以及如何处理错误消息“lambda表达式int[]中的错误返回类型无法转换为int” 错误:(13,49)java:不兼容的类型: lambda表达式int[]中的错误返回类型无法转换为int错误:(13,6