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