java - Java中Enum对应的BiFunctional函数如何实现?

标签 java lambda enums java-8 functional-interface

我有Java 枚举:

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);
        }
    },
}

第二个解决方案,工作正常,但需要太多代码。

最佳答案

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

关于java - Java中Enum对应的BiFunctional函数如何实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54536232/

相关文章:

c++ - 重置由 lambda 值捕获的 boost::shared_ptr

c++ - 检测多个枚举项何时映射到相同值

java - 如何让.properties从Jenkins读取参数

java - 我使用 POST 方法在 header 部分发送用户凭据

java - 按对象集的值过滤对象列表

lisp - 我对符号求值器对动态变量集进行推导的想法

java - 使用Java JsonPath获取JSON父节点

java - 用imageview线性布局覆盖textview

java - 调用 close 方法后打开 MongoDB 连接的问题

json - 如何在Dart中使用枚举的属性名称将JSON映射到对象