gpt4 book ai didi

java - anyMatch 和 allMatch

转载 作者:行者123 更新时间:2023-11-29 03:03:10 25 4
gpt4 key购买 nike

我有几个 predicates我都想得到满足。

能满足那些谓词的东西是少数字符串。单个字符串不必满足所有(或任何)这些谓词,但在我查看最后一个字符串后,所有谓词都必须满足。

我用 Java 表示这个问题的第一个方法是使用 StreamallMatchanyMatch 因为我想要 all 谓词来匹配任何要测试的东西:

Stream<String> thingsToTest = Stream.of("Hi", "predicates!", "oddball");

Predicate<String> startsWithH = string -> string.startsWith("H");
Predicate<String> endsWithBang = string -> string.endsWith("!");
Stream<Predicate<String>> predicates = Stream.of(startsWithH, endsWithBang);

// All of the strings have the chance to satisfy any predicate
boolean predicatesSatisfied = predicates.allMatch(pred -> thingsToTest.anyMatch(pred::test));

// I expect this to print "true"
System.out.println(predicatesSatisfied);

遗憾的是,这不起作用,但以 IllegalStateException 终止,告诉我 stream 已经被操作或关闭,这不应该作为很大的惊喜,因为对于每个谓词,我给字符串一个新的机会来满足谓词,一遍又一遍地使用字符串流。 And streams are not meant to be reused for good reasons.

那么如何避免这种异常呢?是否有比 anyMatchallMatch 更优雅的替代方案?

最佳答案

为了绕过 IllegalStateException,我使用了一个字符串 List 并调用了它的 stream() 方法:

// Use List instead of Stream
List<String> thingsToTest = Arrays.asList("Hi", "predicates!", "oddball");

// Same old
Predicate<String> startsWithH = string -> string.startsWith("H");
Predicate<String> endsWithBang = string -> string.endsWith("!");
Stream<Predicate<String>> predicates = Stream.of(startsWithH, endsWithBang);

// Call stream() on the List
boolean predicatesSatisfied = predicates.allMatch(pred -> thingsToTest.stream().
anyMatch(pred::test));

虽然这工作正常,但我不确定这是否是最优雅的方式,所以如果您有更好的想法,请继续并发布您的代码或建议。

关于java - anyMatch 和 allMatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33617020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com