gpt4 book ai didi

Java 8 等同于 Streams 的 getLineNumber()

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:09:52 26 4
gpt4 key购买 nike

对于 Java 8 中的 Streams,是否有等同于 getLineNumber() 的方法?

我想在文本文件中搜索一个词并将行号作为整数返回。这是我的搜索方法:

result = Files.lines(Paths.get(fileName))
.filter(w -> w.contains(word))
.collect(Collectors.<String> toList());

最佳答案

我认为没有,因为流的设计目的不是提供对其元素的访问,这与集合不同。

一种解决方法是读取列表中的文件,然后使用 IntStream 生成相应的索引,然后您可以从中应用过滤器:

List<String> list =  Files.readAllLines(Paths.get("file"));

//readAllLines current implementation returns a RandomAccessList so
//using get will not have a big performance impact.
//The pipeline can be safely run in parallel
List<Integer> lineNumbers =
IntStream.range(0, list.size())
.filter(i -> list.get(i).contains(word))
.mapToObj(i -> i + 1)
.collect(toList());

这有点矫枉过正,因为您冒着风险将整个文件的内容加载到列表中,之后可能只保留几个元素。如果还不能满足你,你可以写好for循环,代码不多。

也许你会对这个问题感兴趣Zipping streams using JDK8 with lambda (java.util.stream.Streams.zip) .例如,使用 proton-pack图书馆:

List<Long> lineNumbers = 
StreamUtils.zipWithIndex(Files.lines(Paths.get("file")))
.filter(in -> in.getValue().contains(word))
.map(in -> in.getIndex() + 1)
.collect(toList());

或者您可以从 BufferedReader 创建一个 LineNumberReader,然后调用 lines() 并将每一行映射到文件中的行号.请注意,如果管道并行运行,此方法将失败,因此我不推荐它。

LineNumberReader numberRdr = new LineNumberReader(Files.newBufferedReader(Paths.get("file")));

List<Integer> linesNumbers = numberRdr.lines()
.filter(w -> w.contains(word))
.map(w -> numberRdr.getLineNumber())
.collect(toList());

关于Java 8 等同于 Streams 的 getLineNumber(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29878981/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com