想象一个带有布尔标志的 Person 类,该标志指示此人是否可雇用 - 默认情况下设置为 false。
public class Person{
boolean employable = false;
...
}
现在想象有一些作用于 Person 对象的外部布尔方法。例如,考虑实用程序类中的静态布尔方法。
public class PersonUtil{
public static boolean ofWorkingAge(Person p){
if(p.getAge() > 16) return true;
return false;
}
...
}
布尔静态方法本质上类似于布尔值函数,即谓词。
我们可以从谓词中构造一个 2^(#predicates)-by-#predicates 真值表。例如,给定三个谓词:ofWorkingAge、ofGoodCharacter、isQualified ,我们可以构造以下 8×3 真值表:
T T T
T T F
T F T
T F F
F T T
F T F
F F T
F F F
我们现在想雇用具有理想素质的人。让+表示我们希望考虑某人可雇佣(即将他们的可雇佣性标志设置为true)和-反之。
T T T | +
T T F | +
T F T | +
T F F | -
F T T | +
F T F | -
F F T | -
F F F | -
现在想象有一个 Person 对象的集合。对于每个人,我们根据三个谓词调整他们的就业能力标志。我们还更新了一个计数(这迫使我们使用整个真值表而不仅仅是正数),所以给定 1,000 个人,我们希望得到如下结果:
T T T | + 100
T T F | + 200
T F T | + 50
T F F | - 450
F T T | + 50
F T F | - 50
F F T | - 50
F F F | - 50
大概这可以被认为是使用真值表进行过滤。设置就业标志和更新计数是一个相当人为的例子,但你可以很容易地看到我们可能希望如何设置和更新更复杂的东西。
问题
有没有办法优雅地做到这一点?我可以想到两个解决方案:
笨重的解决方案
有一个巨大的手编码if,else if,else链。
if(ofWorkingAge && ofGoodCharacter && isQualified){
c1++;
p.setEmployable(true)
}
else if(ofWorkingAge && ofGoodCharacter && !isQualified){
c2++;
p.setEmployable(true)
}
...
else if(!ofWorkingAge && !ofGoodCharacter && isQualified){
c7++;
}
else{
c8++;
}
这很糟糕。
更智能的解决方案
将谓词(可能在一个数组中)和一组句子传递给一个方法。让方法生成对应的真值表。遍历人员,设置他们的就业能力,并返回一系列计数。
我可以看到如何使用功能接口完成事情。这个 SO 答案可能是相关的。您可以将PrintCommand更改为IsQualified并将callCommand传递给 Person 而不是字符串。但这似乎也有点笨拙,因为我们必须为我们提出的每个谓词都有一个新的接口文件。
有没有其他 Java 8-ish 方法可以做到这一点?