gpt4 book ai didi

functional-programming - 用于通过字段列表检索 map 内部的 java8 流样式?

转载 作者:行者123 更新时间:2023-12-04 23:15:56 28 4
gpt4 key购买 nike

例如,给定如下 map :

{
"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 .将操作推迟到该点是必要的,因为不允许函数修改局部变量。

也可以熔断 mapreduce 的操作操作,允许省略显式类型( <Function> ):
map = (Map)fields.parallelStream()
.reduce(Function.identity(), (f, key)->f.andThen(m->((Map)m).get(key)), Function::andThen)
.apply(map);

也许您现在意识到,这是一项简单的任务 for循环更适合。

关于functional-programming - 用于通过字段列表检索 map 内部的 java8 流样式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42278737/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com