我有一个string和map
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中有大量字符串元素,需要在最后一个字符串中动态替换这些元素。
通常,当需要从元素流中生成单个值时,使用reduce
终端操作。但是,为了使reduce
能够在并行stream
中发挥作用,您必须提供一个组合器函数,该函数接受两个部分结果,并将它们组合成一个完整的结果。在您的示例中,部分结果将是两个string
,通过对输入string
应用一些替换创建。我想不出一种方法来将这两个string
组合成在输入string
上应用所有替换的结果。因此,我所能建议的是一个只对顺序流
起作用的解决方案。
我还忽略了equalsignorecase
逻辑--为了性能起见,我使用了map
的get()
而不是运行嵌套循环,这将需要二倍的时间。也就是说,如果输入字符串
中的键与映射
的对应键
的大小写不同(因为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来循环中的所有值 我不知道如何获得。我试着这样做 但这给了我信笺。 如果我执行,它会给出我想要的正确值