gpt4 book ai didi

java - Java 中的 lambda 函数树?

转载 作者:行者123 更新时间:2023-12-01 23:50:56 27 4
gpt4 key购买 nike

我正在移植一些软件,它可以在 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 对象。示例:

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", 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);

但我对如何将其转换为能够使用 lambda 感到困惑。我不断收到的错误是:错误:类型不兼容:对象不是函数式接口(interface)错误:此处不应有 lambda 表达式

最佳答案

一种可能的 Java 结构保留翻译是:

Map<String, Map<String, Runnable>> obj = Map.of(
"A", Map.of(
"1", () -> System.out.println("A1"),
"2", () -> System.out.println("A2")
),
"B", Map.of(
"1", () -> System.out.println("B1"),
"2", () -> System.out.println("B2")
)
);

你可以这样使用它:

obj.get("A").get("2").run();

如果您需要传递参数或从函数返回值,请将 Runnable 替换为不同的函数接口(interface)。您可能必须自己定义一个。例如:

@FunctionalInterface
interface FunctionWithObjectParameters {
void run(Object... args);
}

更新:如果您需要在 Java 8 中执行此操作,一种选择是使用外部库,该库具有以更方便的方式构造 map 的方法 - 如 guava collect .

另一种选择是自己实现便捷方法。 Map.of 没有任何魔法,您可以轻松地将其替换为您自己的“mapOf”方法:

static <K, V> Map<K, V> mapOf(K key1, V value1) {
return mapOfEntries(entry(key1, value1));
}

static <K, V> Map<K, V> mapOf(K key1, V value1, K key2, V value2) {
return mapOfEntries(entry(key1, value1), entry(key2, value2));
}

static <K, V> Map<K, V> mapOf(K key1, V value1, K key2, V value2, K key3, V value3) {
return mapOfEntries(entry(key1, value1), entry(key2, value2), entry(key3, value3));
}

// Add more overloads if you need

static <K, V> Map<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);
}

关于java - Java 中的 lambda 函数树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63513810/

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