【问题标题】:Generate a String from all values of a specific key from List<Map> in Java?从 Java 中的 List<Map> 中的特定键的所有值生成字符串?
【发布时间】:2021-01-15 05:25:03
【问题描述】:

假设我有一个 Map 列表,例如: (使用json格式只是为了演示)

List<Map> myList = [
    {
        "id": 12,
        "name": "Harie"
    },
    {
        "id": "Forty",
        "location": "Earth"
    },
    {
        "name": "Potah"
    },
    {
        "id": "0"
    }
]

现在我想要一个字符串对象中的所有“id”值,用分隔符分隔。 比如上面的地图应该给我:

"12#Forty#0"

注意: 必须保持它们在列表中的索引顺序。 我知道我可以这样做:

        StringBuilder result = new StringBuilder();
        for (Map map : myList) {
            if (map.get("id") instanceof String) {
                if(result.length()>0){
                    result.append('#');
                }
                result.append(map.get("id"));
            }
        }
        //Use result.toString() for output

但我想要更易读和更简化的代码,最好使用 Java 流 api。

【问题讨论】:

    标签: java java-stream java-11


    【解决方案1】:

    您可以使用流并加入所有不为空的关键id

    String keyString = myList.stream()
               .map(map->map.get("id"))
               .filter(Objects::nonNull)
               .map(Object::toString)
               .collect(Collectors.joining("#"));
    

    如果您想检查该值是否为String 实例,您可以filter

    filter(val-> val!=null && val instance String)
    

    【讨论】:

    • 无论如何,您都必须使用 Object#toString 执行映射或转换为原始类型。
    • 感谢@Naman 我错过了,但更新了答案
    【解决方案2】:
    StringBuilder sb = new StringBuilder();
    myList.stream().map((mapping) => {
       sb.append(mapping.get(id))
       sb.append("#")
    }
    

    您可以在 lambda 函数中添加额外的逻辑!

    【讨论】:

    • 需要使用List::forEach,因为Stream::map 要求您返回一个值。此外,您在 StringBuilder 中造成了一个副作用,它不是“功能性:”,最后无法保证 Stream::mapList::forEach 的顺序,因此此响应存在缺陷。希望这会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-09-03
    • 2011-05-11
    • 2021-02-02
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    相关资源
    最近更新 更多