当前位置: 首页 > 知识库问答 >
问题:

如何迭代映射以替换最终字符串[duplicate]

谯英彦
2023-03-14

我有一个string和map 的列表,如果元素列表与map的关键元素匹配,我需要用map的值替换string的值。

List<String> list=Arrays.asList("key1", "key2","key3","key4");
    Map<String, String> map1  = new HashMap<String, String>() ;
    map1.put("key1", "value1");
    map1.put("key2", "value2");
    map1.put("key11", "value11");
    var classVar=new Object() {
        String sb="";
    };
    classVar.sb="Select * from table1 where key1='apple' and key2='mango'";

    list.stream().forEach (e->{
        map1.forEach((k,v)->{
            if(e.equalsIgnoreCase(k)){
                classVar.sb=classVar.sb.replaceAll(k,v);
            }
        });
    });

如何使用Java8的map()/stream()等功能而不是forEach循环来完成同样的操作?我在list和map中有大量字符串元素,需要在最后一个字符串中动态替换这些元素。

共有1个答案

赵飞雨
2023-03-14

通常,当需要从元素流中生成单个值时,使用reduce终端操作。但是,为了使reduce能够在并行stream中发挥作用,您必须提供一个组合器函数,该函数接受两个部分结果,并将它们组合成一个完整的结果。在您的示例中,部分结果将是两个string,通过对输入string应用一些替换创建。我想不出一种方法来将这两个string组合成在输入string上应用所有替换的结果。因此,我所能建议的是一个只对顺序起作用的解决方案。

我还忽略了equalsignorecase逻辑--为了性能起见,我使用了mapget()而不是运行嵌套循环,这将需要二倍的时间。也就是说,如果输入字符串中的键与映射的对应的大小写不同(因为replaceAll不会忽略大小写),那么equalsignorecase逻辑无论如何也不会工作。

classVar.sb = list.stream()
                  .map (e -> new SimpleEntry<> (e, map1.get (e))) // obtain Map.Entry for each 
                                                                  // element of the list
                  .filter (e -> e.getValue () != null) // filter out null values
                  .reduce(classVar.sb,
                          (s,e)->s.replaceAll(e.getKey (),e.getValue()),
                          (a,b)->{throw new IllegalArgumentException ();}); // apply replacements
                                                                            // on input String
 类似资料:
  • 问题内容: 假设我有以下代码: 这段代码运行后,价值会 如果我以相反的顺序替换它们,则会发生类似的问题: 的值将是 我的目标是把成我怎么能做到呢? 问题答案: 使用Apache Commons StringUtils中的方法:

  • 假设我有一个,我想替换一个值映射,例如: 顺便说一下,字符串也可以是多个字符

  • 输入 system.out.println(leetspeech(“柏林”,替换(“b=8,l=1”)));//=>8er1in 柏林的B和l换成了一个8和1。 我的方法看起来是这样的 但不行,有人能帮我吗?

  • 很抱歉重复了这个问题,但我的问题是其他的。我有一个从json-string解析到map的JSON解析器方法。但是json-string有一个值,这个值也是json-string。大概是这样的: 因此,我的解析方法: 我在客户端得到响应: ?但是随后我得到一个错误,IDE告诉我,是一个字符串。 那么,我如何用我的UserData获得这个LinkedHashMap呢?对不起,为了我的英语。谢谢你。

  • 假设我有以下代码: 这段代码运行后,的值将为

  • 我有我创建的地图的地图 我尝试在第二个映射中迭代键的值。 所以它可以是这样的: key1->keya->value1 -------->键->值2 -------->键->值4 -------->KeyC->value1 我想继续多久就继续多久。 因此,我有,并尝试使用名为的值变量和增量计数器if来循环中的所有值 我不知道如何获得。我试着这样做 但这给了我信笺。 如果我执行,它会给出我想要的正确值