我有许多要逐行读取的文件。
每行包含一个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/