java中lambda函数树?

b1zrtrql  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(383)

我正在移植一些软件,它是用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

eivnm1vs

eivnm1vs1#

一种可能的保留结构的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 具有不同的功能接口。你可能需要自己定义一个。例如:

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

更新:如果您需要在Java8中这样做,一个选择是使用一个外部库,该库具有以更方便的方式构造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);
}

相关问题