栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java 8等效于Stream的getLineNumber()

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 8等效于Stream的getLineNumber()

我不认为这是因为,流并非旨在提供对元素的访问,而不是像集合那样。

一种解决方法是读取列表中的文件,然后使用

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 parallelList<Integer> lineNumbers =      IntStream.range(0, list.size())   .filter(i -> list.get(i).contains(word))   .mapToObj(i -> i + 1)   .collect(toList());

由于您冒着将整个文件的内容加载到列表中,可能只保留一些元素的风险,所以这有点过头了。如果您不满意,可以编写good for循环,这不是很多代码。

也许您可能对此问题感兴趣,使用带有lambda的JDK8压缩流(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
从创建一个
BufferedReader
,然后调用
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());


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/515389.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号