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

时间:2019-02-05 14:07:20

标签: java lambda enums java-8 functional-interface

我有Java enum

public enum ConflictResolutionStrategy {
    softResolve,
    hardResolve,
}

我想像ConflictResolutionStrategy.hardResolve.apply(case1, case2)这样称呼它。

相同类型的case1case2对象。在我的情况下,apply不返回任何内容。

此设计背后的基本思想。创建Strategy设计模式并根据设置的enum值解决冲突。

即使简单的搜索,我也无法在StackOveflow上找到任何类似的问题,这些问题无法直接解决我的问题。

我尝试了以下操作:

public enum ConflictResolutionStrategy {
    softResolve ((CaseType case1, CaseType case2) -> case1.update(case2)),
    hardResolve,
}

以上版本无法编译。

我尝试了另一种解决方案:

public enum ConflictResolutionStrategy {
    softResolve,
    hardResolve {
        public void apply(CaseType case1, CaseType case2) {
            case1.update(case2);
        }
    },
}

第二种解决方案可以,但是需要太多代码。

2 个答案:

答案 0 :(得分:7)

一个接受两个参数却不返回任何值的函数是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);
    }

}

假设您有一种处理案件的方法:

public void processCases(Collection<CaseType> cases, BiConsumer<CaseType, CaseType> conflictResolutionStrategy){
    // ...
}

现在您可以传递现有策略之一:

processCases(cases, ConflictResolutionStrategy.softResolve);

或内联策略:

processCases(cases, (c1, c2) -> { /* do smth here */ }); 

答案 1 :(得分:1)

也许您正在枚举中寻找BiConsumer之类的东西:

public enum ConflictResolutionStrategy {
    softResolve(CaseType::update), // just for example
    hardResolve((caseType, caseType2) -> {
        caseType.update(caseType2);
    }); // lambda representation

    BiConsumer<CaseType, CaseType> caseTypeBiConsumer;

    ConflictResolutionStrategy(BiConsumer<CaseType, CaseType> caseTypeBiConsumer) {
        this.caseTypeBiConsumer = caseTypeBiConsumer;
    }
}


class CaseType {
    void update(CaseType caseType){}
}