【问题标题】:Is there any way to replace a Map value inside a List using java 8?有没有办法使用 java 8 替换 List 中的 Map 值?
【发布时间】:2019-11-19 06:20:32
【问题描述】:

我有以下代码。我需要根据我已经拥有的键值替换地图的值。

定义类有以下变量:

private Map<String, String> rows;
private String tableName;

我已尝试使用以下代码。这可以通过其他更简单的方式实现吗?

/*Definitions*/
Definition definitionObj = new Definition();
definitionObj.setTableName("TABLE1");
Map map = new HashMap<String,String>();
map.put("1","one");
map.put("2","two");
map.put("3","threee");
definitionObj.setRows(map);

Definition definitionObj1 = new Definition();
definitionObj1.setTableName("TABLE2");
Map map1 = new HashMap<String,String>();
map1.put("4","one");
map1.put("5","two");
map1.put("6","threee");
definitionObj1.setRows(map1);

String key1 = "2";
String value1 = "modifiedvalue"; /*the value that i need to set*/

List<Definition> myList = Arrays.asList(definitionObj,definitionObj1);

Definition result1 = myList.stream()                       
        .filter(x -> "TABLE1".equals(x.getTableName()))        
        .findAny()                                     
        .orElse(null);
result1.getRows().replace(key1,value1);
System.out.println(result1);

【问题讨论】:

  • 我认为 for 循环会比您的流更简单。另外,不要对潜在的空指针进行操作。
  • 我相信你在这里使用的是非标准类。 Definition 似乎不是 Java 8 的一部分。它可能是一个库。如果是这样,请告诉我们是哪一个,以便我们提供帮助。
  • DefinitionClass:公共类定义实现可序列化{ private Map rows;私有字符串表名; public Map getRows() { return rows;} public void setRows(Map rows) { this.rows = rows;} public String getTableName() { return tableName; } public void setTableName(String tableName) { this.tableName = tableName; } @Override public String toString() { return "Definition{" + "rows=" + rows + ", tableName='" + tableName + '\'' + '}'; } }
  • 如果在您执行replace 时代码中的result1result1.getRows 为空怎么办?

标签: java list dictionary java-8


【解决方案1】:

findAny 方法返回一个可选项,您可以将其映射到字典,然后使用 ifPresent 更新给定键的字典值。这是它的外观。

myList.stream().filter(x -> "TABLE1".equals(x.getTableName()))
    .findAny().map(Definition::getRows)
    .ifPresent(m -> m.put(key1, value1));

除此之外,您的Map 声明应更改为使用参数化类型而不是原始类型。改成这样,

Map<String, String> map = new HashMap<>();

但是,更好的方法是在 Definition 类中声明一个新的 API 方法,以根据所需参数更新内部状态,然后在客户端代码中使用它。这是它的外观。

public void updateRows(String key, String value) {
    if (rows.containsKey(key))
        rows.put(key, value);
}

myList.stream().filter(x -> "TABLE1".equals(x.getTableName())).findAny()
                .ifPresent(d -> d.updateRows(key1, value1));

虽然前者违反了封装,但后者没有。

【讨论】:

    猜你喜欢
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    相关资源
    最近更新 更多