【问题标题】:JAVA process two stream into one single map [duplicate]JAVA将两个流处理成一个映射[重复]
【发布时间】: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


    【解决方案1】:

    没有随机访问的流的 Guava Streams.zip

    如果 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
    • @user1686407,没错,Streams 被标记为@Beta 很长时间了。要处理此 api 中更改/删除的可能性,可以将其抽象为 Util 类。在某些应用程序中这可能是一种开销,请确定它是否适合您的用例。
    【解决方案2】:

    您可以先将两个流收集到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);
    

    【讨论】:

      猜你喜欢
      • 2014-08-26
      • 2021-09-23
      • 1970-01-01
      • 2018-04-07
      • 2016-05-13
      • 2014-07-22
      • 1970-01-01
      • 2019-12-12
      • 2018-09-08
      相关资源
      最近更新 更多