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循环,代码不多。
也许你会对这个问题感兴趣使用 JDK8 和 lambda 压缩流 (java.util.stream.Streams.zip)。例如,使用质子包图书馆:
List<Long> lineNumbers =
StreamUtils.zipWithIndex(Files.lines(Paths.get("file")))
.filter(in -> in.getValue().contains(word))
.map(in -> in.getIndex() + 1)
.collect(toList());
或者您可以创建一个LineNumberReader
from a BufferedReader
,然后调用lines()
并将每一行映射到文件中的行号。请注意,这种方法将fail如果管道是并行运行的,那么我不推荐它。
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());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)