Dmy*_*kyi 8 java lambda enums java-8 functional-interface
我有Java enum:
public enum ConflictResolutionStrategy {
softResolve,
hardResolve,
}
Run Code Online (Sandbox Code Playgroud)
我想称之为ConflictResolutionStrategy.hardResolve.apply(case1, case2).
两者case1和case2相同类型的对象.apply在我的情况下应该什么也不返回
这个设计背后的基本思想.Strategy根据设定enum值创建设计模式并解决冲突.
我在StackOveflow上找不到任何类似的问题,即使简单的搜索也给了我很多类似的案例,这些案例并没有直接解决我的问题.
我尝试了以下内容:
public enum ConflictResolutionStrategy {
softResolve ((CaseType case1, CaseType case2) -> case1.update(case2)),
hardResolve,
}
Run Code Online (Sandbox Code Playgroud)
上面的这个版本不编译.
我试过另一个解决方案
public enum ConflictResolutionStrategy {
softResolve,
hardResolve {
public void apply(CaseType case1, CaseType case2) {
case1.update(case2);
}
},
}
Run Code Online (Sandbox Code Playgroud)
第二种解决方案,运行正常但需要太多代码.
接受两个参数并且不返回任何内容的函数是a BiConsumer.
你的枚举可以实现BiConsumer:
public enum ConflictResolutionStrategy implements BiConsumer<CaseType, CaseType> {
softResolve ((case1, case2) -> case1.update(case2)),
hardResolve((case1, case2) -> {/* do something else */});
private final BiConsumer<CaseType, CaseType> consumer;
ConflictResolutionStrategy(BiConsumer<CaseType, CaseType> consumer){
this.consumer = consumer;
}
@Override
public void accept(CaseType case1, CaseType case2) {
consumer.accept(case1, case2);
}
}
Run Code Online (Sandbox Code Playgroud)
假设您有处理案例的方法:
public void processCases(Collection<CaseType> cases, BiConsumer<CaseType, CaseType> conflictResolutionStrategy){
// ...
}
Run Code Online (Sandbox Code Playgroud)
现在您可以传递任何一种现有策略:
processCases(cases, ConflictResolutionStrategy.softResolve);
Run Code Online (Sandbox Code Playgroud)
或内联策略:
processCases(cases, (c1, c2) -> { /* do smth here */ });
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
256 次 |
| 最近记录: |