【问题标题】:Java 8 Stream List into map with identical valuesJava 8 Stream List 到具有相同值的映射中
【发布时间】:2017-01-12 00:52:47
【问题描述】:

我的情况很奇怪。是否有将 List 流式传输到具有相同值的地图?

a 的类型为Map< Integer, List< String > >

假设b 只是与a 的键对应的整数列表。

b.stream().map(x ->
    a.get(x).stream()
        .collect(
            Collectors.toMap(i -> i, x);
        )
);

我想要一个地图,其中所有值都是 x,所有键都来自 b 中的值。

上面的函数应该返回一个Stream< List< Map< String, Int > > >(显然它不起作用)

【问题讨论】:

  • 你能展示示例输入和输出数据吗?
  • 您发布的代码应该生成一个映射流,每个映射将所有键映射到一个值。我不知道你为什么想要那个,也不知道列表在哪里出现。
  • toMap 中的第二个值也需要是 lambda Collectors.toMap(i -> i, i -> x)
  • 在我看来,上面的内容会创建一个Map<String, Int>。你可以把它变成一个List<Map<String, Int>>,但在最后一个;之前添加另一个collect调用。不确定作为地图列表流意味着什么 - 这似乎是一个太多的集合/流。
  • 这看起来像是一个 XY 问题。如果你想要的只是“一张地图……所有的键都来自 b 中的值”,你可能只想要Map< Integer, List< String > > result = b.stream().collect( Collectors.toMap(i -> i, a::get) );,假设“x”是List<String>。否则,您应该首先正确描述您的实际问题。

标签: java java-8 java-stream collectors


【解决方案1】:

toMap 方法中的第二个值也需要是一个 lambda(即它需要满足接口Function<? super T, ? extends U>,其中Tb 流中对象的类型,并且U 是结果映射中值的类型)

Map<Integer, List<String>> a = ...
List<Integer> b = ...
Stream<Map<String, Integer>> c = b.stream().map(x ->
        a.get(x).stream()
                .collect(Collectors.toMap(i -> i, i -> x)));

【讨论】:

    猜你喜欢
    • 2019-05-16
    • 2020-02-06
    • 1970-01-01
    • 2020-12-14
    • 2019-04-19
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多