我有一个问题,我想知道是否有使用 Streams 的解决方案。
想象一下你有一个有序的对象流;让我们假设一个整数流。
Stream<Integer> stream = Stream.of(2,20,18,17,4,11,13,6,3,19,4,10,13....)
Run Code Online (Sandbox Code Playgroud)
现在我想过滤一个值与该值之前的前一个数字之差大于n的所有值。
stream.filter(magicalVoodoo(5))
// 2, 20, 4, 11, 3, 19, 4, 10 ...
Run Code Online (Sandbox Code Playgroud)
我有可能这样做吗?
是的,这是可能的,但是您将需要一个有状态谓词来跟踪以前的值以进行比较。这确实意味着它只能用于顺序流:使用并行流,您会遇到竞争条件。
幸运的是,大多数流默认为顺序流,但如果您需要对来自未知源的流执行此操作,您可能需要检查 usingisParallel()并抛出异常,或使用 将其转换为顺序流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));
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里使用,因为它是一个更好的类型,但这个概念与(或其他对象类型)IntStream类似。Stream<Integer>
| 归档时间: |
|
| 查看次数: |
1537 次 |
| 最近记录: |