如何解决强制Streams.zip遍历每个元素的最佳方法是什么使用Guava,Java
我正在尝试使用Streams.zip创建地图。我不在乎流返回的结果,我只需要为每个元素执行lambda。这是我的代码
String x[] = {"a","b"};
String y[] = {"c","d"};
var data = new HashMap<String,String>();
var myStream = Streams.zip(Arrays.stream(x),Arrays.stream(y),(arg1,arg2) -> { data.put(arg1,arg2); return 0; };
var result = myStream.collect(Collectors.toList()); // ideally don't want this line
在没有collect()行的情况下,我不会填充地图,因此最简单的方法是尝试使用count()而不是collect,但这会完全压缩zip。 还是有没有Streams.zip的更简单的单行解决方案来从两个列表填充地图?
解决方法
您应该改用Streams#forEachPair
:
String x[] = {"a","b"};
String y[] = {"c","d"};
var data = new HashMap<String,String>();
Streams.forEachPair(Arrays.stream(x),Arrays.stream(y),data::put);
System.out.println(data); // {a=c,b=d}
很明显,如果您不需要控制HashMap,只需收集以下内容即可:
String x[] = {"a","d"};
var result = Streams.zip(Arrays.stream(x),Maps::immutableEntry)
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));
System.out.println(result); // {a=c,b=d}
,
另一种方法:
String[] keys = {"k1","k2"};
String[] values = {"v1","v2"};
Map<String,String> result = IntStream.range(0,keys.length).boxed()
.collect(Collectors.toMap(i -> keys[i],i -> values[i]));
这具有无副作用的优点,而不必在合并之前手动创建地图条目,所有这些都由收集器本身处理。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。