Java Long Stream包含特定数字

neo*_*811 5 java java-8 java-stream

我想检查一下,如果a LongStream包含一个特定的数字至少一次,但不完全包含这个数字:

我的方法:

public static boolean containsNum(LongStream input, int n) {

    return input.anyMatch(i -> i == n);

}
Run Code Online (Sandbox Code Playgroud)

测试:

assertEquals(false, containsNum(LongStream.of(1, 2, 3), 19)); // ok
assertEquals(true, containsNum(LongStream.of(1, 2, 3, 19), 19)); //ok
assertEquals(true, containsNum(LongStream.of(1, 19, 19), 19)); //ok
assertEquals(false, containsNum(LongStream.of(1), 19)); //ok
assertEquals(false, containsNum(LongStream.of(19, 19), 19)); // FAIL
assertEquals(false, containsNum(LongStream.of(19), 19)); //FAIL
Run Code Online (Sandbox Code Playgroud)

我知道anyMatch在我的问题上无法解决问题,但我找到了最好的解决方案.我怎样才能通过所有测试?

Mal*_*wig 11

这听起来像是一个简化功能,正如安迪的回答所显示的那样,但是只要你找到了数字和不同的数字,它就会经过整个流而不是停止.

问题是...Match流的那些方法一次只查看一个元素,即你必须在一些外部状态变量中保存有关传递元素的知识.wero和Roland在他们的答案中证明了这一点.

一种可能性而不依赖于外部状态而只检查所需数量的元素将是:

boolean pass = longStream.map(l -> l == number ? 1 : 0)
                         .distinct()
                         .limit(2)
                         .count()
                         == 2;
Run Code Online (Sandbox Code Playgroud)

  • 我建议在`.distinct()`和`.count()`之间插入一个`limit(2)`,以获得类似行为的短路,并删除`AtomicBoolean`变体,因为它没有优势,也没有简单也不高效.顺便说一句,如果你需要在他们想要的环境中处理`AtomicBoolean`,读多线程,你应该知道`atomicBoolean.set(atomicBoolean.get()|| condition)`被破坏了(搜索"check" - 然后反对模式").相反,使用`atomicBoolean.compareAndSet(false,condition)`... (2认同)
  • 究竟.我们知道,最多有两个数字,但流实现不知道.因此明确指定`limit(2)`,我们允许在遇到两个值后停止. (2认同)