当前位置: 首页 > 面试题库 >

Java 8等效于Stream的getLineNumber()

翁心思
2023-03-14
问题内容

Java 8中的Streams是否有等效于getLineNumber()的东西?

我想在文本文件中搜索单词,然后将行号返回为Integer。这是我的搜索方法:

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());

由于您冒着将整个文件的内容加载到列表中,可能只保留一些元素的风险,所以这有点过头了。如果您不满意,可以编写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());


 类似资料:
  • 如果我有以下列表: 并应用以下(Java8): 然后我会得到一个带有“Hello”和“World”的列表。

  • 问题内容: 我正在从xml配置转移到注释。我想转换一个会话范围的bean是 可以通过注释完成此操作吗?如果没有,我该怎么做才能使该声明继续工作? 问题答案: 在spring上下文xml中,执行以下操作: 请注意,尽管如此,你将需要为该包中的所有类编写接口。

  • 问题内容: 据我所知,Java没有C#之类的东西。是否有其他Java库提供类似功能?( 反射反射 )有什么区别? 问题答案: 除了达林的出色答案(+1)外,ASM也值得一试。

  • 问题内容: 我试图找到与generate_series()(PostgreSQL语法)相当的snowflake。 问题答案: 这就是我能够在Snowflake中生成一系列日期的方式。我将行数设置为1095,以获得3年的日期,您当然可以将其更改为适合您的用例的日期 最初在这里找到 编辑:此解决方案是不正确的。不能保证序列无间隙。请遵循其他答案,而不是这个。感谢@Marcin Zukowski指出这一

  • 标题说明了一切。我的问题是关于不同的字符串等价方法的效率。我经常使用<代码>。equalsIgnoreCase(String str),因为我对它很有兴趣。但我开始怀疑这是否是寻找字符串之间等价性的最有效方法。在我看来,正在调用一种大小写转换方法或,然后在其定义中调用,但我可能错了。那么,以下哪种方法在以下情况或任何情况下更有效?

  • 问题内容: 该表示法是: 实际上不哈希对象;它实际上只是转换为字符串(通过它是一个对象,还是其他各种原始类型的内置转换),然后在“ ”中查找该字符串,而不对其进行哈希处理。也不会检查对象是否相等-如果两个不同的对象具有相同的字符串转换,则它们将彼此覆盖。 鉴于此-在JavaScript中是否有任何有效的hashmap实现?(例如,第二个Google结果产生的实现对任何操作都是O(n)。其他各种结果