Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以使用lambda值映射<;键、功能>;?_Java_Lambda - Fatal编程技术网

Java 是否可以使用lambda值映射<;键、功能>;?

Java 是否可以使用lambda值映射<;键、功能>;?,java,lambda,Java,Lambda,我有一个为我生成的类集合,所以我不能修改这些类来添加多态行为。不幸的是,我需要根据继承中的类型有一些不同的行为 一种解决方案是为所有这些对象编写decorator,这样我就可以用类似DDD的行为来扩充这些对象,或者使用一些访问者模式。但是,我想到了另一种更简单的方法来根据类型执行一些不同的行为 下面是我所想的,也是一个有趣的练习,它将介绍Java中Lambda的可能: Map<Class, SomeLambdaFunction<String>> typeMap = Imm

我有一个为我生成的类集合,所以我不能修改这些类来添加多态行为。不幸的是,我需要根据继承中的类型有一些不同的行为

一种解决方案是为所有这些对象编写decorator,这样我就可以用类似DDD的行为来扩充这些对象,或者使用一些访问者模式。但是,我想到了另一种更简单的方法来根据类型执行一些不同的行为

下面是我所想的,也是一个有趣的练习,它将介绍Java中Lambda的可能:

Map<Class, SomeLambdaFunction<String>> typeMap = ImmutableMap.<Class, SomeLambdaFunction<String>>builder()
    .put(SubClassA.class, () -> someCondition() ? "valueA" : "valueB")
    .put(SubClassB.class, () -> aStringMethod() + anotherStringMethod())
    .build();
Map-typeMap=ImmutableMap.builder()
.put(subassa.class,()->someCondition()?“valueA”:“valueB”)
.put(子类B.class,()->aStringMethod()+另一个StringMethod())
.build();
我想通过这种方式“查找”一个行为。因为我不希望生成的类集合再发生变化(这是旧的遗留内容),所以我不担心违反规则


这可能吗?

可能,但必须使用接口作为值类型,然后使用lambda定义实现

可用的一些常见接口有、和或。Runnable没有返回值,可调用抛出
异常
迫使您捕获它,函数需要一个参数。供应商仍然是一个很好的候选人

下面是一个基于供应商和子类的密钥示例:

public String getLambdaValueForKey(String key) {
    final Map<Class<? extends YourBaseClass>, Supplier<String>> lambdaMap = ImmutableMap.<Class<? extends YourBaseClass>, Supplier<String>>builder()
        .put(SubclassA.class, () -> someCondition() ? "valueA" : "valueB")
        .put(SubclassB.class, () -> aStringMethod() + anotherStringMethod())
        .build();
    return lambdaMap.get(key).get(); // the 2nd get is Supplier's .get()
}
公共字符串getLambdaValueForKey(字符串键){

final Map您所说的
Lambda
是什么意思?
Lambda
不是Java语言中的类型,也不是Java标准库中定义的类型。在运行时没有“Lambda”这样的东西。至少,如果您没有定义它,就没有这样的东西

lambda表达式只是创建新对象的一种方式。当然,您不能使用它来创建任何对象,但您可以使用它来创建属于实现某些特定函数接口的匿名类的对象。但是,lambda的结果与所有其他类型的对象没有本质上的区别。它是只是一个物体

所以,您真正要问的是,“是否有可能创建一个映射,将
Class
类型的键映射到其他类型的值?”

是的,这是可能的

更具体地说,您需要的是一个
Map
,其中
Foobar
是lambda都实现的功能接口类型的名称


与编写
SomeLambdaFunction
不同,如果您这样编写示例,我认为您的示例会更有意义:

@FunctionalInterface
interface CustomBehavior {
    String doCustomThing();
}

Map<Class, CustomBehavior> typeMap =
    ImmutableMap.<Class, CustomBehavior>builder()
        .put(SubClassA.class, () -> someCondition() ? "valueA" : "valueB")
        .put(SubClassB.class, () -> aStringMethod() + anotherStringMethod())
        .build();

这个例子稍微好一点,因为它实际上使用lambda而不是静态的
字符串
。如果需要使用此选项,则需要重新考虑应用程序逻辑。这比建议使用
instanceof
作为问题解决方案的答案更糟糕“根据
,我如何做不同的事情?”问题。@Boristespider我大体上同意,但这是一个非常特殊的情况,但是生成的结构是永久固定的(旧的遗留代码)。我更新了答案以反映这一点。这是答案-没有“lambda”这样的东西-这只是实现SMI的简写。
@FunctionalInterface
interface CustomBehavior {
    String doCustomThing();
}

class CustomBehaviorA implements CustomBehavior {
    public String doCustomThing() {
        return someCondition() ? "valueA" : "valueB";
    }
}

class CustomBehaviorB implements CustomBehavior {
    public String doCustomThing() {
        return aStringMethod() + anotherStringMethod();
    }
}

Map<Class, CustomBehavior> typeMap =
    ImmutableMap.<Class, CustomBehavior>builder()
        .put(SubClassA.class, new CustomBehaviorA())
        .put(SubClassB.class, new CustomBehaviorB())
        .build();