gpt4 book ai didi

java - 有序流的状态过滤器

转载 作者:搜寻专家 更新时间:2023-11-01 02:57:12 26 4
gpt4 key购买 nike

我有一个问题,我想知道是否有使用 Streams 的解决方案。

假设您有一个有序对象流;让我们假设一个整数流。

 Stream<Integer> stream = Stream.of(2,20,18,17,4,11,13,6,3,19,4,10,13....)

现在我想过滤所有值与该值之前的前一个数字之差大于 n 的所有值。

stream.filter(magicalVoodoo(5))
// 2, 20, 4, 11, 3, 19, 4, 10 ...

我有可能这样做吗?

最佳答案

是的,这是可能的,但您需要一个有状态的谓词来跟踪先前的值以进行比较。这确实意味着它只能用于顺序流:对于并行流,您会遇到竞争条件。

幸运的是,大多数流默认为顺序流,但如果您需要对来自未知来源的流执行此操作,您可能需要使用 isParallel() 进行检查并抛出异常,或使用 sequential() 将其转换为顺序流.

一个例子:

public class DistanceFilter implements IntPredicate {

private final int distance;
private int previousValue;

public DistanceFilter(int distance) {
this(distance, 0);
}

public DistanceFilter(int distance, int startValue) {
this.distance = distance;
this.previousValue = startValue;
}

@Override
public boolean test(int value) {
if (Math.abs(previousValue - value) > distance) {
previousValue = value;
return true;
}
return false;
}

// Just for simple demonstration
public static void main(String[] args) {
int[] ints = IntStream.of(2, 20, 18, 17, 4, 11, 13, 6, 3, 19, 4, 10, 13)
.filter(new DistanceFilter(5))
.toArray();

System.out.println(Arrays.toString(ints));
}
}

我用了IntStream在这里,因为它是一个更好的类型,但概念与 Stream<Integer> 类似(或其他对象类型)。

关于java - 有序流的状态过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52761108/

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