Java 8 Streams统计所有键

Byt*_*der 2 java lambda java-8 java-stream

我有一个文件,其中包含JSON格式的数据.我正在逐行阅读它,每行都有1个JSON记录,所以格式确实不是问题.以下是一个示例行:

{"url": "http://ldrlongdistancerider.com/bikers_rights_motorcycle/rightsriders0163.php", "timestamp": 1257072412, "tags": ["nscensorship", "cloudmark", "network", "solutions", "content", "based", "spam", "signatures"]}
Run Code Online (Sandbox Code Playgroud)

我需要做的是计算所有重复的URL并将其打印为:

 http://ldrlongdistancerider.com/bikers_rights_motorcycle/rightsriders0163.php"  1
Run Code Online (Sandbox Code Playgroud)

如何使用流来实现这一目标?顺便说一下,我需要根据时间戳过滤记录.因此,如果有人通过了一系列日期,我将不得不计算落在该范围内的网址.我已经完成了大部分工作,但这个计算部分对我来说很困惑.

这是我到目前为止所做的:

for (Path filePath : files) {
        try {
            Files.lines(Paths.get(filePath.toUri()))
                 .filter(s -> Link.parse(s).timestamp() > startSeconds)
                 .filter(s -> Link.parse(s).timestamp() < stopSeconds)
                 .forEach(s -> countMap.put(Link.parse(s).url(), 1));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
Run Code Online (Sandbox Code Playgroud)

countMap是String,Integer的HashMap

JB *_*zet 5

你正在解析多次,而你正在改变外部地图,而不是让流为你创建地图,这是一种反模式(这使得很难使流并行)

你可以使用

Files.lines(Paths.get(filePath.toUri()))
     .map(Link::parse)
     .filter(link -> link.timestamp() > startSeconds && link.timestamp() < stopSeconds)
     .collect(Collectors.groupingBy(Link::url, Collectors.counting()));
Run Code Online (Sandbox Code Playgroud)