我有许多要逐行读取的文件。
每行包含一个url,后跟一个时间戳,后跟多个标签

我有一个名为Link的类,该类解析每一行并提供静态方法来获取

Link::url
Link::timestamp
Link::tags  where this returns a List of tagstrings


网址可以与标签一起在文件中重复。
我需要从所有文件中读取行,为每个url收集标签,并消除重复项
然后将结果以url tag1,tag2,tag3的格式写入输出文件

我可以使用Java 7使用map / reduce来做到这一点,但无法弄清楚如何使用lambda表达式来做到这一点。有人告诉我可以用一行代码完成?

这就是我所拥有的。我被过滤器卡住了。我想我想做的就是创建一个带有url和TreeMap的键的映射,其中TreeMap将包含所有唯一标记。我只是不知道怎么写
任何帮助,将不胜感激。

public static void tagUnion() throws Exception {
    Stream<Path> fstream = Files.list(Paths.get(indir));
    fstream.forEach(path -> {
        Stream<String> lines;
        try (Stream<String> entry = Files.lines(path)) {
            entry
            .filter(s -> !s.isEmpty())
            .map(Link::parse)
            .filter(map -> inDate(map.timestamp()));
            // this is where I’m stuck
        } catch (IOException e) {
            e.printStackTrace();
        }
    });
}

最佳答案

我建议改用Stream::flatMap。此方法将流中的每个对象映射到相同类型的不同流,并将它们组合为一个可以继续处理的流。例如:

Files.list(somePath)
        .flatMap(Files::lines)
        .filter(s -> !s.isEmpty())
        .map(Link::parse)
        .filter(map -> inDate(map.timestamp()));


现在,要执行您要的操作,需要编写一种方法来处理该链接并将其解析为所需的行。

最后,要使用定界符(换行符或逗号)将字符串流收集为一个字符串,有一种方法可以实现:

String csvLine = stream.collect(Collectors.joining(",");

关于java - 需要使用lambda映射多个文件中的减少行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47918670/

10-11 22:00
查看更多