如何解决Java中的lambda函数树?
我正在移植一些软件,并且可以在Swift和JavaScript中运行,但是我不知道如何在Java中实现它。
JavaScript版本如下:
var obj = { "A": {
"1": (params) => { console.log("A1",params); },"2": (params) => { console.log("A2",params); }
},// A
"B": {
"1": (params) => { console.log("B1","2": (params) => { console.log("B2",params);}
},//B
}; // obj
在运行时,应用程序引擎会调用
var a = 'A';
var i = '2';
obj[a][i](params);
我一辈子都无法弄清楚如何用Java做到这一点。一个关键的约束(无双关语)是代码在结构上必须与其他端口相似。
以前,我尝试将Object [] []与
一起使用Map<String,Object> map = Stream.of(obj).collect(Collectors.toMap(data -> (String) data[0],data -> (Object) data[1]));
以便能够嵌入一些Map
Map<String,Integer> colorMap = Stream.of(new Object[][] {
{"black",0x000000},{"navy",0x000080},};
我试图得到类似的代码,但是Java不喜欢它,因为lambda和Object不兼容。
我要获取的代码是:
Map<String,Map<String,Callable<Void> > > obj = Stream.of(new Object[][] {
{"A",Stream.of(new Object[][] {
{"1",(params)->{ System.out.println("A1"); } },{"2",(params)->{ System.out.println("A2"); } } }),{"B",(params)->{ System.out.println("B1"); } },(params)->{ System.out.println("B2"); } } } )}
}
});
...
// call the function (assuming A and 1 exist)
obj.get("A").get("1")(params);
但是我很困惑如何将其转换为能够使用lambda。我不断得到的错误是:
error: incompatible types: Object is not a functional interface
或error: lambda expression not expected here
解决方法
一种可能的保留结构的Java翻译是:
Map<String,Map<String,Runnable>> obj = Map.of(
"A",Map.of(
"1",() -> System.out.println("A1"),"2",() -> System.out.println("A2")
),"B",() -> System.out.println("B1"),() -> System.out.println("B2")
)
);
您可以这样使用它:
obj.get("A").get("2").run();
如果需要传递参数或从函数返回值,请用其他函数接口替换Runnable
。您可能必须定义自己的一个。例如:
@FunctionalInterface
interface FunctionWithObjectParameters {
void run(Object... args);
}
更新:如果您需要使用Java 8进行此操作,一种选择是使用外部库,该库具有以更方便的方式构造地图的方法-例如guava collect。 / p>
另一个选择是自己实现便捷方法。 Map.of
没有任何作用,您可以轻松地用自己的“ mapOf”方法替换它:
static <K,V> Map<K,V> mapOf(K key1,V value1) {
return mapOfEntries(entry(key1,value1));
}
static <K,V value1,K key2,V value2) {
return mapOfEntries(entry(key1,value1),entry(key2,value2));
}
static <K,V value2,K key3,V value3) {
return mapOfEntries(entry(key1,value2),entry(key3,value3));
}
// Add more overloads if you need
static <K,V> mapOfEntries(Map.Entry<K,V>... args) {
// On Android,you may want to use ArrayMap instead of HashMap
Map<K,V> map = new HashMap<>();
for (Map.Entry<K,V> arg : args) {
map.put(arg.getKey(),arg.getValue());
}
return map;
}
static <K,V> Map.Entry<K,V> entry(K key,V value) {
return new AbstractMap.SimpleEntry<>(key,value);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。