【问题标题】:Map need to be filter without tmst values地图需要在没有 tmst 值的情况下进行过滤
【发布时间】:2020-03-30 12:05:42
【问题描述】:

在下面的地图中,如果键包含“tmst”,我必须删除键和值

输入图:

{"sun":"test", "row_mod_tmst":"10:05:20", "when" :"yesterday"}

输出图:

{"sun":"test", "when" :"yesterday"}

我已经尝试了如下,它不起作用

 Map<String, Object> withoutTMST = map.entrySet().stream().filter(entry -> (!entry.getKey().endsWith("tmts"))).
                    collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

【问题讨论】:

  • 在您的过滤器中声明:endsWith("TMTS"))。那里有2个错误:1)它说TMTS,而不是应该的TMST。 2)如果你想让它匹配,你必须确保大小写也匹配,换句话说,在你的示例 json 中,TMST 字符串是小写的,所以你的匹配字符串也应该是。
  • 这是拼写错误。还是不行
  • endsWith("tmts") 应该是 endsWith("tmst")
  • 为什么endsWith 当你在你的问题陈述中说:I have to remove key and values if key contains "tmst"。只需使用contains

标签: java hashmap


【解决方案1】:

我只会从地图中删除这些条目,而不是创建新的地图对象。

Collection#removeIf 是一个很好的候选,应用于地图的entrySet()

至于删除条件,我将containstoLowerCase()结合使用。

代码如下:

map.entrySet().removeIf(entry -> entry.getKey().toLowerCase().contains("tmst"));

输入:

{ sun=test, row_mod_tmst=10:05:20, when=yesterday }

输出:

{ sun=test, when=yesterday }

【讨论】:

    【解决方案2】:

    您可以使用正则表达式过滤"tmst" 值。

    试试这个:

    Map<String, Object> withoutTMST = map.entrySet().stream().filter(entry -> !entry.getKey().matches(".*((?i)TMST)$")).
            collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
    
    System.out.println(withoutTMST);
    

    输出:

    {when=yesterday, sun=test}
    

    关于正则表达式:

    • .* 匹配任意字符
    • ?i 不区分大小写匹配
    • $行尾

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-26
      • 2021-12-24
      • 1970-01-01
      • 2021-09-14
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      • 2013-04-08
      相关资源
      最近更新 更多