提供没有先前Collectors.toMap的BiConsumer

时间:2016-10-20 11:42:19

标签: java java-8 java-stream

我想从BufferedReader读取行,将String拆分为两个并将它们提供给BiConsumer。可以在没有事先将两个拆分字符串收集到Map中的情况下完成吗?

示例:

bufferedReader.lines()
    .collect(Collectors.toMap(l -> l.split(",")[0], l -> l.split(",")[1]))
    .forEach(translations1::put);

可以通过某种方式删除Collectors.toMap来改进吗?

2 个答案:

答案 0 :(得分:4)

我要做的是保留toMap

Map<String, String> map = bufferedReader.lines()
                                        .map(l -> l.split(",", 2))
                                        .collect(Collectors.toMap(a -> a[0], a -> a[1]));

除非我缺少一项要求,否则toMap似乎值得保留。

顺便说一句,如果你想要一个功能性解决方案,你应该尽量避免forEach或任何修改状态的lambda。它可以在Java中工作,但如果你可以避免它,我相信你应该。如果你没有副作用,功能编程是最清晰的。

答案 1 :(得分:1)

另一种方法是明确调用accept的方法BiConsumer作为下一个:

bufferedReader.lines()
    .map(line -> line.split(",", 2))
    .forEach(a -> consumer.accept(a[0], a[1]));

在您的特定情况下,假设translations1Map<String, String>,您可以使用相应的BiConsumer(来自Holger的提案)将键/值对添加到地图中):

bufferedReader.lines()
    .map(line -> line.split(",", 2))
    .forEach(a -> translations1.put(a[0], a[1]));

这将在地图中添加新的键/值对,如果您尝试放置其键已存在的键/值对,则会替换现有值。