2

我正在尝试使用方法引用来压缩我的代码。这是我正在尝试改进的一条线:

assertThat("only true & false strings allowed",
        records.stream().map(Record::getType)
        .allMatch(s -> "true".equals(s) || "false".equals(s)));

使用方法参考可能会更好:

assertThat("only true & false strings allowed",
       records.stream().map(Record::getType).allMatch("true"::equals));

但是我可以在谓词中添加“false”吗?

4

3 回答 3

5

String我所知道的类或 JDK 中没有任何方法与您的Predicate. 你可以定制一个

public static boolean match(String arg) {
    return "true".equals(arg) || "false".equals(arg);
}

并使用它

assertThat("only true & false strings allowed",
   records.stream().map(Record::getType).allMatch(Example::match);

或者您可以使用Pattern正则表达式作为Predicate

assertThat("only true & false strings allowed",
   records.stream().map(Record::getType)
          .allMatch(Pattern.compile("^(false|true)$").asPredicate()));

而且,正如Holger 在评论中所建议的,您可以使用

.allMatch(Arrays.asList("true", "false")::contains)

或从Set.

于 2015-05-20T18:20:03.843 回答
0

您可以使用和链接Predicates在一起,但首先您必须强制您的方法引用到谓词Predicate.and()Predicate.or()

Predicate<String> trueTest = "true"::equals;

然后,您可以在比赛中进行链接

records.stream().map(Record::getType).allMatch( trueTest.or("false"::equals));

或在流外创建一个谓词

Predicate<String> trueTest = "true"::equals;
Predicate<String> trueOrFalseTest = trueTest.or("false"::equals);


records.stream().map(Record::getType).allMatch( trueOrFalseTest );

无论哪种方式,我都没有发现任何一个比您的原始代码更清晰。

于 2015-05-20T18:23:21.823 回答
0

它不是单行的,但您可以使用以下.or()方法Predicate

Predicate<String> isTrue = "true"::equals;
Predicate<String> isFalse = "false"::equals;

assertThat("only true & false strings allowed",
   records.stream().map(Record::getType).allMatch(isTrue.or(isFalse)))
于 2015-05-20T18:26:41.050 回答