当前位置: 首页 > 知识库问答 >
问题:

如何将流

虞修平
2023-03-14

我正在尝试合并一个

例如,

final Map<String, someOtherObjectToProcess> someObject;

final List<Map<String, Map<String, String>>> list = someObject.entrySet()
            .stream()
            .flatMap(this::getInfoStream)
            .collect(Collectors.toList());

getInfoStream的签名是

public Stream<Map<String, Map<String, String>>> getInfoStream(Map.Entry<String, someOtherObjectToProcess> entry)

如果我使用(Collectors.toList())我能够得到这些Map对象的列表。

如果使用上述代码,则输出示例:

[{
    "name" : {
        "property":"value"
    }
},

{
    "name2" : {
        "property":"value"
    }
}]

但我想收集到一张有结构的地图上

{
    "name" : {
        "property":"value"
    },
    "name2" : {
        "property":"value"
    }
}

前提是密钥是唯一的。

如何使用Collectors.toMap()或任何其他替代方法来做到这一点?


共有3个答案

孔波
2023-03-14

在我看来,最具可读性的方法是将所有内容映射到映射。输入,然后使用收集器::toMap将所有内容收集回地图

import static java.util.stream.Collectors.toMap;

// ...

someObject.entrySet()
          .stream()
          .flatMap(this::getInfoStream)
          .flatMap(map -> map.entrySet().stream())
          .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (one, two) -> one));

<代码>(一,二)-

慕飞章
2023-03-14

解决这个问题的另一种方法是不使用收集器(toList()),而是使用另一个重载的。收集()方法与供应商、累加器和组合器:

Stream<Map<String, Map<String, String>>> stream = ...
Map<String, Map<String, String>> result = stream
       .collect(HashMap::new, HashMap::putAll, HashMap::putAll);
董鸣
2023-03-14
匿名用户

当你有

Stream<Map<String, Map<String, String>>> stream = ...

(我假设这是flatMap(this::getInfoStream)的结果)您可以调用

.flatMap(map -> map.entrySet().stream())

从将生成流的所有映射创建条目流

现在,从该流中,您需要做的就是从地图的每个条目中收集键和值。假设每个键在您可以使用的所有地图中都是唯一的

.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

但若键不是唯一的,那个么您需要决定应该为同一个键在新映射中放置什么值。我们可以通过填写 零件输入

.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (vOld, vNew) -> ...));
//                                                                                ^^^

其中,vOld保存同一键下结果图中当前保存的值,而vNew保存新值(来自当前流“迭代”)
例如,如果要忽略新值,只需返回旧值/当前由持有的值(vOld,vNew)-

简而言之(假设密钥唯一):

Map<String, Map<String, String>> combinedMap = 
        /*your Stream<Map<String, Map<String, String>>>*/
        .flatMap(map -> map.entrySet().stream())
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

 类似资料:
  • 问题内容: 如何将无序列表居中放置为固定宽度? 问题答案: 要使ul 居中并使li元素也居中,并使ul的宽度动态变化,请使用display:inline-block; 并将其包裹在居中的div中。

  • 问题内容: 如何使用CSS 在另一个文件中水平居中? 问题答案: 您可以将此CSS应用于内部: 当然,您不必将设置为。任何小于包含宽度的宽度都可以使用。是什么呢实际定心。 如果您以Internet Explorer 8(及更高版本)为目标,最好改用以下方法: 它将使内部元素水平居中,并且无需设置特定的 width。 这里的工作示例:

  • 我得到了一个导入的文本块,但格式并不总是那么完美。之后我会尝试用jquery解决这个问题。所以我开始用 替换 : null null 但替换不起作用。最终的html应该如下所示:

  • 我想用可选的。由于只能连接流,我有以下问题: 如何将可选 转换为流 ? 示例:

  • 问题内容: 请告诉我如何将Java模块/源代码嵌入C#应用程序中?例如,我有一些用Java编写的逻辑,该逻辑使用了一些第三方库,这些库只能在Java平台上找到。而且我有用C#编写的主要主机逻辑。如果我能够将来自Java的回调注册到C#中,那将非常酷。 非常感谢你!!! 问题答案: 您可以尝试IKVM吗? IKVM.NET对于几种不同的软件开发方案很有用。这里是一些可能性的示例。 嵌入式JVM 在.

  • 问题内容: 当我尝试粘贴到HTML文本文件中时,我总是被踢出外壳。如何才能做到这一点?我首先需要使用一些JavaScript对其进行编码吗? 例: 编辑 我只在HTML中放入单引号,然后将整个内容都用双引号引起来,但仍然没有好处。外壳错误: 问题答案: 您需要删除或编码字符串中的控制字符。 例如,将您的文本粘贴到此处,然后编码为UTF-8 ECMAScript(表示javascript字符串)。