我所拥有的:我有一个逐行读取的文件.这些行不计入文件中.
我想做什么:我想对一个流中的每一行进行计数,并仅返回出现特定文本的数字.
到目前为止,我有:
public static Integer findLineNums(String word)
throws IOException {
final Map map = new HashMap<>();
final List lines = Files.lines(Paths.get(PATH)).collect(Collectors.toList());
IntStream.rangeClosed(0, lines.size()-1).forEach(f -> map.put(lines.get(f), f+1));
return map.get(word);
}
问题:如何仅使用单个流执行此操作?
编辑问题:我想在Stream中做所有事情,这还包括将其累积到列表中.
最佳情况是:
Files.lines(Paths.get(PATH)).superAwesomeStreamFuncs().collect(Collectors.toList());
编辑:就我而言,我只会返回一个Integer,但我想获得类似Integer List的信息.
解决方法:
这有效:
int[] i = new int[]{0}; // trick to make it final
List hits =
.map(s -> s.contains(word) ? ++i[0] : - ++i[0])
.filter(n -> n > 0)
.collect(Collectors.toList());
这里的主要“技巧”是使用数组,该数组的引用不会改变(即它是“有效的最终”),但它使我们可以将其(仅)元素更改为计数器,无论如何,该元素都可以在线递增.快速筛选器会排除不匹配项.
一些测试代码:
String word = "foo";
int[] i = new int[]{0};
List hits = Stream.of("foo", "bar", "foobar")
.map(s -> s.contains(word) ? ++i[0] : - ++i[0])
.filter(n -> n > 0)
.collect(Collectors.toList());
System.out.println(hits);
输出:
[1, 3]
标签:stream,java
来源: https://codeday.me/bug/20191028/1952097.html