如何在Java中实现与Enum相对应的BiFunctional函数?

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).

两者case1case2相同类型的对象.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)

第二种解决方案,运行正常但需要太多代码.

ETO*_*ETO 7

接受两个参数并且不返回任何内容的函数是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)