我正在移植一些软件,它是用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", params); },
"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<string,integer>对象。例子:
Map<String, Integer> colorMap = Stream.of(new Object[][] {
{"black", 0x000000},
{"navy", 0x000080},
};
我试图得到类似的代码,但java不喜欢,因为lambdas和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", Stream.of(new Object[][] {
{"1", (params)->{ System.out.println("B1"); } },
{"2", (params)->{ System.out.println("B2"); } } } )}
}
});
...
// call the function (assuming A and 1 exist)
obj.get("A").get("1")(params);
但如何将其转换为能够使用lambdas,这让我很困惑。我经常遇到的错误是: error: incompatible types: Object is not a functional interface
或者 error: lambda expression not expected here
1条答案
按热度按时间eivnm1vs1#
一种可能的保留结构的java翻译是:
你这样使用它:
如果需要传递参数或从函数返回值,请替换
Runnable
具有不同的功能接口。你可能需要自己定义一个。例如:更新:如果您需要在Java8中这样做,一个选择是使用一个外部库,该库具有以更方便的方式构造Map的方法—比如guava collect。
另一个选择是自己实现便利方法。
Map.of
不做任何魔术,您可以轻松地用自己的“mapof”方法替换它: