强制 Streams.zip 遍历每个元素的最佳方法是什么(使用 Guava,Java)
Whats the best way to force Streams.zip to iterate over each element (using 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", "b"};
String y[] = {"c", "d"};
var result = Streams.zip(Arrays.stream(x), Arrays.stream(y), 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]));
这样做的好处是 side-effect 免费,同时不必在合并之前手动创建地图条目,所有这些都由收集器自己处理。
我正在尝试使用 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", "b"};
String y[] = {"c", "d"};
var result = Streams.zip(Arrays.stream(x), Arrays.stream(y), 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]));
这样做的好处是 side-effect 免费,同时不必在合并之前手动创建地图条目,所有这些都由收集器自己处理。