【问题标题】:How do I store a boolean test/expression without Evaluating it?如何在不评估的情况下存储布尔测试/表达式?
【发布时间】:2014-10-04 22:51:48
【问题描述】:

所以我希望能够在不存储值的情况下存储 boolean 测试 (true/false),我希望能够通过方法通过多个这些 boolean 测试.甚至可能切换参数和运算符。有没有办法做到这一点?

我看到有些人将它们保存为Strings,然后使用 BeanShell 中的Interpreter,但还有其他方法吗?还是我应该尽力创造一种方法来做到这一点?

【问题讨论】:

  • 请举例说明您要达到的目标
  • 你不能“存储”一个表达式而不在 Java 中求值,但你可以稍后执行一个方法(或 lambda)来求值。
  • 首先让我们从术语开始:truefalseboolean 表达式可以具有的唯一值。您所说的是保存逻辑条件的文本表示。
  • 存储布尔测试而不存储值”不知道你的意思。
  • Lambda 看起来像我想要的,谢谢大家。 @Takendarkk 我的意思是传递 ("happy" == "good") 部分而不传递 truefalse 值。不久前我意识到我基本上想传递函数,我意识到这是一个愚蠢的问题。还是谢谢

标签: java boolean boolean-expression


【解决方案1】:

在 Java 8 中,您可以使用 lambda。 java.util.function 有许多类表示返回布尔值的函数(PredicateBiPredicateIntPredicateDoublePredicate 等),这些类型可用于保存返回布尔值的表达式。示例:

BiPredicate<Integer,Integer> pred = (x, y) -> x > y;

现在pred 包含一个测试第一个整数是否更大的函数,但在您使用类似的东西之前,该函数实际上不会被计算

boolean result = pred.test(arg1, arg2);

【讨论】:

  • 谢谢! Lambda 看起来像我想要的!
【解决方案2】:

您可以使用匿名函数来存储表达式以供将来使用。例如:

class GreaterThanTester implements Callable<Boolean> {

    private int a;
    private int b;

    public GreaterThanTester(int a, int b) {
        this.a = a;
        this.b = b;
    }

    @Override
    public Boolean call() {
        return (a > b);
    }
}

然后,您可以像这样存储表达式:

Callable<Boolean> storedTester = new GreaterThanTester(10, 20);

然后在评估时:

Boolean result = storedTester.call();


您可以像这样创建许多不同类型的Testers,并将它们全部存储为Callable&lt;Boolean&gt;

【讨论】:

    猜你喜欢
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 2015-10-09
    相关资源
    最近更新 更多