我想从BufferedReader读取行,将String拆分为两个并将它们提供给BiConsumer。可以在没有事先将两个拆分字符串收集到Map中的情况下完成吗?
示例:
bufferedReader.lines()
.collect(Collectors.toMap(l -> l.split(",")[0], l -> l.split(",")[1]))
.forEach(translations1::put);
可以通过某种方式删除Collectors.toMap来改进吗?
答案 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]));
在您的特定情况下,假设translations1
是Map<String, String>
,您可以使用相应的BiConsumer
(来自Holger的提案)将键/值对添加到地图中):
bufferedReader.lines()
.map(line -> line.split(",", 2))
.forEach(a -> translations1.put(a[0], a[1]));
这将在地图中添加新的键/值对,如果您尝试放置其键已存在的键/值对,则会替换现有值。