如何实现Java中Enum对应的BiFunctional函数?
How to implement BiFunctional function that corresponds to Enum in Java?
我有 Java
enum
:
public enum ConflictResolutionStrategy {
softResolve,
hardResolve,
}
我想这样称呼它 ConflictResolutionStrategy.hardResolve.apply(case1, case2)
。
case1
和 case2
对象都是同一类型。 apply
在我的例子中应该 return 没有。
这个设计背后的基本思想。创建 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
的东西:
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){}
}
接受两个参数且不返回任何内容的函数是 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
enum
:
public enum ConflictResolutionStrategy {
softResolve,
hardResolve,
}
我想这样称呼它 ConflictResolutionStrategy.hardResolve.apply(case1, case2)
。
case1
和 case2
对象都是同一类型。 apply
在我的例子中应该 return 没有。
这个设计背后的基本思想。创建 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
的东西:
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){}
}
接受两个参数且不返回任何内容的函数是 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 */ });