【问题标题】:Connect a HashMap's key and value to a list将 HashMap 的键和值连接到列表
【发布时间】:2016-07-01 05:43:34
【问题描述】:

我想用':'将HashMap的键和值连接到一个字符串,并将它们转换成一个列表。

例子:

Map<String,String> tags = new HashMap<>();
tags.put("k1","v1");
tags.put("k2","v2");

那我想得到字符串

k1:v1,k2:v2

我的代码是:

private String transe(Map<String, String> tags) {
    if (tags == null || tags.isEmpty()) {
        return DEFAULT_STATUS_GROUP;
    }
    List<String> tagKVList = new ArrayList<>();
    tags.forEach((key, value) -> tagKVList.add(String.join(":", key, value)));
    tagKVList.sort((tag1, tag2) -> tag1.compareTo(tag2));
    return tagKVList.stream().collect(Collectors.joining(","));
}

如何去掉局部变量tagKVList,让代码更清晰?

【问题讨论】:

  • Lambda 表达式是一个不错的功能,但您仍然不需要它们来指定多余的东西。 Strings 是 Comparable,这就是他们有 compareTo 方法的原因,所以你不需要指定 (tag1, tag2) -&gt; tag1.compareTo(tag2) 比较器。您可以使用 tagKVList.sort(null) 或者,如果您喜欢类型安全,请使用 tagKVList.sort(Comparator.naturalOrder())

标签: java string java-8 java-stream


【解决方案1】:

您不需要中间的List。您可以将Stream entrySetmap 每个条目添加到 Stringcollect 到单个 String,就像您已经做的那样:

return tags.entrySet().stream()
                      .map(e-> String.join(":", e.getKey(), e.getValue()))
                      .sorted()
                      .collect(Collectors.joining(","));

【讨论】:

  • 旧的 e.getKey()+":"+e.getValue() 可以代替 String.join(":", e.getKey(), e.getValue())... 哦,你忘记了 sorted() 步骤。
  • @Holger 谢谢,我错过了这一步。
猜你喜欢
  • 2019-10-06
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
相关资源
最近更新 更多