如何过滤掉另一个范围内的一系列数字

时间:2016-10-27 20:45:02

标签: java java-stream

我试图在Java 8中创建一个IntStream,我想从中过滤掉另一个范围。例如,如果我有以下数组:

{1, 2, 3, 4, 5, 6, 7, ..., 20}

我想保留除{4, 5, 6, 7}

之外的所有内容

我创建了以下IntStream:

IntStream.rangeClosed(1, 20);

但是,我喜欢做某种事情的可能性:

IntStream.rangeClosed(1, 20).filter(IntStream.rangeClosed(4, 7));

有没有办法这样做?显然,没有办法做到这一点,但我可能会弄错。在此先感谢您的回复

2 个答案:

答案 0 :(得分:4)

简单范围检查有什么问题?

(b' -> c') -> (a' -> b') -> (a' -> c')  -- composition
b' -> c' ~ a -> b -> (a,b)              -- first argument (,)
a' -> b' ~ t n -> n                     -- second argument sum
----------------------------------------------------------------
a' ~ t n
b' ~ a ~ n
c' ~ a -> b -> (a,b)
----------------------------------------------------------------
a' -> c' ~ t a -> b -> (a,b)

答案 1 :(得分:1)

为什么不制作两个流并且连续? 1-3和8-20?

IntStream.concat(IntStream, IntStream)

通过这样做,您可以跳过对每个元素的检查。

另一个建议是将其转换为两组并执行

range1.boxed().collect(Collectors.toSet());
range2.boxed().collect(Collectors.toSet());

range1.removeAll(range2);