【发布时间】:2021-02-18 22:02:21
【问题描述】:
我有两个流
Stream<Key> keys;
Stream<Value> values;
我想将它们合并成一个Map
Map<Key, Value> result = someMagicMethod(keys, values);
有什么优雅的方法可以做到这一点?
我知道有一个方法叫Stream.concat,但它不适用于这种情况。
【问题讨论】:
标签: java java-stream
我有两个流
Stream<Key> keys;
Stream<Value> values;
我想将它们合并成一个Map
Map<Key, Value> result = someMagicMethod(keys, values);
有什么优雅的方法可以做到这一点?
我知道有一个方法叫Stream.concat,但它不适用于这种情况。
【问题讨论】:
标签: java java-stream
如果 Guava 在运行时可用,那么以下方法会有所帮助:
List<String> keys = Arrays.asList("One", "Two");
List<Integer> values = Arrays.asList(1, 2);
Map<String, Integer> zipped = Streams.zip(keys.stream(), values.stream(), SimpleEntry::new)
.collect(Collectors.toMap(Collectors.toMap(Entry::getKey, Entry::getValue)));
System.out.println(zipped);
【讨论】:
30.1-jre)的番石榴,这个 api 也标有@Beta
Streams 被标记为@Beta 很长时间了。要处理此 api 中更改/删除的可能性,可以将其抽象为 Util 类。在某些应用程序中这可能是一种开销,请确定它是否适合您的用例。
您可以先将两个流收集到List。
List<Key> keyList = keys.collect(Collectors.toList());
List<Value> valueList = values.collect(Collectors.toList());
Map<Key, Value> map = IntStream.range(0, keyList.size())
.boxed().collect(Collectors.toMap(keyList::get, valueList::get));
System.out.println(map);
【讨论】: