- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有几个 predicates我都想得到满足。
能满足那些谓词的东西是少数字符串。单个字符串不必满足所有(或任何)这些谓词,但在我查看最后一个字符串后,所有谓词都必须满足。
我用 Java 表示这个问题的第一个方法是使用 Stream的 allMatch
和 anyMatch
因为我想要 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.
那么如何避免这种异常呢?是否有比 anyMatch
或 allMatch
更优雅的替代方案?
最佳答案
为了绕过 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/
我有几个 predicates我都想得到满足。 能满足那些谓词的东西是少数字符串。单个字符串不必满足所有(或任何)这些谓词,但在我查看最后一个字符串后,所有谓词都必须满足。 我用 Java 表示这个问
在 allmatch 的情况下,我想找出哪个元素使谓词失败。 List numbers = Arrays.asList(1, 2, 3, 4, 5); boolean isEven = numbers
令我困扰的是(出于性能原因),如果不先创建流,我就无法在列表上调用 allMatch、anyMatch。所以我开始创建这样的实用方法: public static boolean anyMatch(
我想对 Java 流使用一条语句。 我想过滤所有要求为“true”的 Servicework 对象,然后检查所有 Servicework 对象的状态是否为“完成”。 但是如果 serviceworkL
我有以下流代码: List results = items.stream() .map(item -> requestDataForItem(item)) .filter(data ->
我有 X509 证书。我正在尝试从中提取所有 SAN。之后,我想确保 SAN 的类型为 dNSName - 即列表中的第一个条目应该是值为 2 的整数。引用- https://docs.oracle.
我想要以下逻辑:(我知道它不起作用,因为它不止一次消耗流)。但我不确定如何实现它。 Stream buffers = super.getBuffers().stream(); if (buffers.
int testValue; boolean success = false; while(success == false) { testValue = generateRandomInt();
我的同事和我遇到了一个错误,这是由于我们假设调用 allMatch() 的空流将返回 false。 if (myItems.allMatch(i -> i.isValid()) { //do
我想使用以 allMatch 终端操作结束的单个流链获得一个 false 值。 但是,我发现由于allMatch操作的设计,它在处理空流时会返回true。 例如,以下代码返回 true,因为过滤后的流
这个问题已经有答案了: Why does Stream.allMatch() return true for an empty stream? (6 个回答) 已关闭 4 年前。 每Java SE 8
我在另一篇文章中读到,经过调查发现 anyMatch 终端操作的工作方式是每个线程(在子流上操作)定期检查其他线程是否已找到结果,如果是,则所有其他线程都是停止了。 我假设,但想知道是否有人可以验证
考虑这个片段 - String a = "hello" , b = null, c = "guru"; boolean value = Stream .of(a, b, b.substrin
我是一名优秀的程序员,十分优秀!