是否可以检查数组(或集合)是否包含元素5和除了5之外的元素.在一个流中返回布尔值而不是使用两个流:
int[] ints = new int[]{1,2,3,4,5}; boolean hasFive = IntStream.of(ints).anyMatch(num -> num == 5); boolean hasNonFive = IntStream.of(ints).anyMatch(num -> num != 5); boolean result = hasFive && hasNonFive;
解决方法
在这种具体情况下,即要知道流或数组是否包含两个,匹配和非匹配元素(与谓词的否定相匹配的元素),您可以简单得多.
首先,测试第一个元素是否匹配谓词或其否定,然后搜索流是否包含相反的匹配项:
IntPredicate predicate=i -> i==5; if(ints.length>0 && predicate.test(ints[0])) predicate=predicate.negate(); boolean result = IntStream.of(ints).anyMatch(predicate);
而已.如果您没有数组或集合作为流源,但是任意流,测试第一个元素有点棘手:
IntPredicate[] tmp={ null }; Spliterator.OfInt sp=intStream.spliterator(); boolean result = sp.tryAdvance( (int i) -> tmp[0]=predicate.test(i)? predicate.negate(): predicate) && StreamSupport.intStream(sp,false).anyMatch(tmp[0]);