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

如何使用java.util.stream处理文件的chunck

公冶智刚
2023-03-14

为了熟悉stream api,我试图编写一个非常简单的模式。

问题:文本文件不包含嵌套的文本块。所有块由开始/结束模式(例如,)标识

我只是能够实现一些丑陋的东西,比如:
Files.lines(path)。收集(新的MySequentialParseAndProsessEachLineCollector

我在寻找一个类似的映射:< br> Files.lines(路径)。map(MyMapAllLinesOfBlockToBuckets())。parallelStream()。收集(新的MyProcessOneBucketCollector

有没有一种从java 8流中提取数据块的好方法似乎包含解决方案的骨架。不幸的是,我要顽固地把它翻译成我的问题。;-)

有什么提示吗?


共有1个答案

龚俭
2023-03-14

这是一个可用于转换流的解决方案

public class ChunkSpliterator implements Spliterator<List<String>> {
    private final Spliterator<String> source;
    private final Predicate<String> start, end;
    private final Consumer<String> getChunk;
    private List<String> current;

    ChunkSpliterator(Spliterator<String> lineSpliterator,
        Predicate<String> chunkStart, Predicate<String> chunkEnd) {
        source=lineSpliterator;
        start=chunkStart;
        end=chunkEnd;
        getChunk=s -> {
            if(current!=null) current.add(s);
            else if(start.test(s)) current=new ArrayList<>();
        };
    }
    public boolean tryAdvance(Consumer<? super List<String>> action) {
        while(current==null || current.isEmpty()
                            || !end.test(current.get(current.size()-1)))
            if(!source.tryAdvance(getChunk)) return false;
        current.remove(current.size()-1);
        action.accept(current);
        current=null;
        return true;
    }
    public Spliterator<List<String>> trySplit() {
        return null;
    }
    public long estimateSize() {
        return Long.MAX_VALUE;
    }
    public int characteristics() {
        return ORDERED|NONNULL;
    }

    public static Stream<List<String>> toChunks(Stream<String> lines,
        Predicate<String> chunkStart, Predicate<String> chunkEnd,
        boolean parallel) {

        return StreamSupport.stream(
            new ChunkSpliterator(lines.spliterator(), chunkStart, chunkEnd),
            parallel);
    }
}

匹配谓词的行不包括在块中;如果需要,很容易改变这种行为。

它可以这样使用:

ChunkSpliterator.toChunks( Files.lines(Paths.get(myFile)),
    Pattern.compile("^<start>$").asPredicate(),
    Pattern.compile("^<stop>$").asPredicate(),
    true )
   .collect(new MyProcessOneBucketCollector<>())

模式指定为 ^word$,以要求整行仅由单词组成;如果没有这些锚点,包含模式的线可以开始和结束一个块。源流的性质在创建块时不允许并行性,因此当使用即时收集操作进行链接时,整个操作的并行性相当有限。这取决于MyProcessOneBucketCollector是否可以有任何并行性。

如果您的最终结果不依赖于源文件中存储桶的出现顺序,则强烈建议您的收集器将自己报告为UNORDERED,或者在流的方法链中插入一个unorder()收集之前。

 类似资料:
  • 我正在处理IDE中制作一个Java处理项目,并希望将其传播到多个PDE(处理源代码)文件中。 我无法使用导入将Java处理源代码文件导入为Java类文件。 <代码>配置。pde <代码>项目。pde 返回导入项目/配置无法解析 分别为。 我必须先编译PDE文件吗?是否可以将处理IDE设置为每次运行都自动执行? 太长,读不下去了 拥有此项目文件夹: 如何使用配置中的函数和变量。项目中的pde。pde

  • 问题内容: 由于POI具有更多功能,因此我从jxl切换到poi。但是,我无法处理以旧格式生成的xls文件。现在我收到此错误: org.apache.poi.hssf.OldExcelFormatException:提供的电子表格似乎是Excel 5.0 / 7.0(BIFF5)格式。POI仅支持BIFF8格式(从Excel版本97/2000 / XP / 2003开始) 现在,我正在考虑根据xls

  • 问题内容: 我准备使用Java创建文件浏览器。目的是尽可能地模仿默认资源管理器的行为,无论底层操作系统是什么。 我没有用Java完成GUI编程。 我查找了Swing,SWT和JFace,并从本教程开始我的项目:http : //www.ibm.com/developerworks/opensource/library/os- ecgui1/ 我想知道您对解决此问题的最佳方法的看法。如果您可以评论编

  • 问题内容: 有人可以为我指出如何在python中打开.mdb文件的正确方向吗?我通常喜欢包含一些代码以开始讨论,但是我不知道从哪里开始。我与mysql一起使用python。我想知道是否有一种以类似方式使用.mdb文件的方法? 问题答案: 以下是我为另一个SO问题编写的一些代码。 它需要第三方的pyodbc模块。 这个非常简单的示例将连接到表并将结果导出到文件。 如果您有任何其他更具体的需求,请随时

  • 我想使用java程序运行一个批处理文件,当我双击. bat文件时,它要求我输入“D”,然后在C驱动器中创建一些文件夹,以下是. bat文件的内容: 我的Java代码如下: 它没有给我任何错误,但它既没有要求我输入任何值,也没有创建任何文件夹。 我想知道在java代码中我需要做什么,这样它会要求我输入' D ',然后输入。bat文件应该以正常流程继续。 感谢任何帮助。

  • 本文向大家介绍使用Python的netrc文件处理,包括了使用Python的netrc文件处理的使用技巧和注意事项,需要的朋友参考一下 python中的netrc类用于从用户家庭环境的unix系统中的.netrc文件中读取数据。这些是隐藏文件,包含用户的登录凭据详细信息。这对于ftp,curl等工具成功读取.netrc文件并将其用于操作很有帮助。 以下程序显示了如何使用python的netrc模块