例如,给定如下所示的地图:
{
"k1": {
"k2": {
"k3": {
"k4": "v"
}
}
}
}
和一个字段列表["k1","k2","k3"]
,我需要检索该部分{"k4": "v"}
.
下面是我的java7风格的代码:
// Ignore the map building code.
Map map1 = new HashMap();
Map map2 = new HashMap();
Map map3 = new HashMap();
Map map4 = new HashMap();
map4.put("k4", "v");
map3.put("k3", map4);
map2.put("k2", map3);
map1.put("k1", map2);
Map map = map1;
System.out.println(map); //=> {k1={k2={k3={k4=v}}}}
// Code to be transformed to java8 style
List<String> fields = Arrays.asList("k1", "k2", "k3");
for(String field: fields) {
map = (Map) map.get(field);
}
System.out.println(map); //=> {k4=v}
那么如何将上面的代码转换为java 8流风格呢?
我不认为将其转换为函数式风格有任何好处;循环很好并且准确地表达了您正在做的事情。
但为了完整起见,您可以按以下方式执行此操作:
map = (Map)fields.stream()
.<Function>map(key -> m -> ((Map)m).get(key))
.reduce(Function.identity(), Function::andThen).apply(map);
这会将每个键转换为能够对该键进行映射查找的函数,然后将它们组合成应用于您的单个函数map
。将操作推迟到该点是必要的,因为不允许函数修改局部变量。
也可以融合map
操作与reduce
操作,允许省略显式类型(<Function>
):
map = (Map)fields.parallelStream()
.reduce(Function.identity(), (f, key)->f.andThen(m->((Map)m).get(key)), Function::andThen)
.apply(map);
也许您现在认识到,这是一项只需简单操作即可完成的任务for
循环更适合。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)