【问题标题】:Add key value pair to List<Map<String, Object>>将键值对添加到 List<Map<String, Object>>
【发布时间】:2021-06-06 17:56:32
【问题描述】:

我有一个 List>,它返回如下输出。

[{ID:55, Item=6455, Quantity=3, Cost=150$},{ID:89, Item=0566, Quantity=2, Cost=30$},{ID:112, Item=5477, Quantity=1, Cost=50$},{ID:345, Item=6768, Quantity=10, Cost=280$}]

我正在尝试在 List 的每个 Map 的开头添加键值对“Size=large”。我使用下面的代码来添加键和值。

List<Map<String, Object> returnList = null;
returnList = jdbcTemplate.query(itemQuery, extractor);
Map<String,Object> map = new LinkedHashMap<>();
map.put("Size","large");
returnList.add(map);
System.out.println(returnList);

现在我得到的输出是:

[{ID:55, Item=6455, Quantity=3, Cost=150$},{ID:89, Item=0566, Quantity=2, Cost=30$},{ID:112, Item=5477, Quantity=1, Cost=50$},{ID:345, Item=6768, Quantity=10, Cost=280$}, {Size=large}]

我怎样才能得到下面的输出来为列表的每个地图添加价值?

[{Size=large, ID:55, Item=6455, Quantity=3, Cost=150$},{Size=large, ID:89, Item=0566, Quantity=2, Cost=30$},{Size=large, ID:112, Item=5477, Quantity=1, Cost=50$},{Size=large, ID:345, Item=6768, Quantity=10, Cost=280$}]

// 我能够根据以下#Quadslab 回复得到我的问题的答案//

int size=returnList.size();
for(Map<String,Object> map : returnList) {
    Map<String,Object> mapcopy = new HashMap<String, Object>();
for(Map<String,Object> entry: map.entrySet()){
mapcopy.put(entry.grtKey(),entry.getValue());
}
    map.clear();
    map.put("Size","large");
    map.putAll(mapcopy);
}

【问题讨论】:

    标签: java collections java-stream


    【解决方案1】:
    for(Map<String,Object> map : returnList) {
        map.put("Size","large");
    }
    

    这会将其添加到末尾。
    要在开头添加它,还有一点工作。

    int size=returnList.size();
    for(Map<String,Object> map : returnList) {
        Map<String,Object> mapcopy = new LinkedHashMap<String,Object>(map);
        map.clear();
        map.put("Size","large");
        map.putAll(mapcopy);
    }
    

    这段代码基本上来自这个answer

    【讨论】:

    • 谢谢!我可以添加到最后。现在我需要在一开始就得到它。
    • @Nithyashree 我为此编辑了答案
    • 感谢您提供克隆示例。 map.clone() 方法对我不起作用,但我可以通过编辑几行来获得输出。
    • int size=returnList.size(); for(Map map : returnList) { Map mapcopy = new HashMap(); for(Map entry: map.entrySet()){ mapcopy.put(entry.grtKey(),entry.getValue()); } map.clear(); map.put("大小","大"); map.putAll(mapcopy); }
    • @Nithyashree 感谢您的反馈!我将方法更改为使用 LinkedHashMap(Map&lt;? extends K, ? extends V&gt; m) 构造函数。另请记住,创建对象会产生内存开销,因此在大规模情况下,您可能应该考虑其他方法(如果性能不够好),例如 Basil Bourque 的回答。
    【解决方案2】:

    更新现有地图,不要实例化

    不要实例化新的Map 对象,不需要您的new LinkedHashMap&lt;&gt;()。您想更新现有地图,而不是替换地图,因此附加一张额外的地图。

    您可以使用 for-each 循环来修改列表中的每个地图对象。

    for( Map<String, Object> map , listOfMaps )
    {
        map.put( "Size" , "large" ) ;
    }
    

    地图顺序

    你说:

    在每个地图的开头

    Map 的底层实现可能支持也可能不支持订单。引用 Javadoc:

    地图的顺序定义为地图集合视图上的迭代器返回其元素的顺序。一些地图实现,如 TreeMap 类,对它们的顺序做出特定的保证;其他的,比如 HashMap 类,则不需要。

    使用类

    您的代码急需一个自定义类。 Java 是一种强大的面向对象语言,所以使用对象来表示这种数据。

    record

    Java 16 带来了一个新特性records,更简单地定义了一个主要目的是透明和不可变地传递数据的类。您只需声明成员字段。编译器隐式创建构造函数、getter、equals & hashCodetoString

    public record LineItem (  String size , int id , String item , int quantity , BigDecimal cost ) {}
    

    像任何类一样使用。

    list.add(
        new LineItem( "large" , 55 , "6455" , 3 , new BigDecimal( 150 ) ) ;
    );
    

    【讨论】:

      猜你喜欢
      • 2021-04-29
      • 2018-09-22
      • 2020-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 2015-11-21
      • 1970-01-01
      相关资源
      最近更新 更多