Java 如果条件取决于当前值和以前的值,如何在takeWhile中检查条件?

Java 如果条件取决于当前值和以前的值,如何在takeWhile中检查条件?,java,java-stream,Java,Java Stream,我有一个arrayList,如下所示: [{hours: 48, cancellationCharges: 0}, {hours: 12, cancellationCharges: 10}, {hours: 0, cancellationCharges: 20}] 上述阵列意味着在出发前0至12小时内,可收取20%的取消费。从出发前12小时到48小时,适用10%的取消费,超过48小时,根本不收取取消费 我想过滤以上内容,找出一天之后适用的取消费用。i、 例如,在上述情况下,结果应为 [

我有一个arrayList,如下所示:

[{hours: 48, cancellationCharges: 0}, 
 {hours: 12, cancellationCharges: 10}, 
 {hours: 0, cancellationCharges: 20}]
上述阵列意味着在出发前0至12小时内,可收取20%的取消费。从出发前12小时到48小时,适用10%的取消费,超过48小时,根本不收取取消费

我想过滤以上内容,找出一天之后适用的取消费用。i、 例如,在上述情况下,结果应为

[{hours: 48, cancellationCharges: 0}, 
 {hours: 12, cancellationCharges: 10}]

我尝试按条件hours>=24进行筛选,如果最后一个元素的hours不是24,我将再次迭代以查找hours<24的第一个元素。有没有更好的办法解决这个问题。我使用的是java12。

您只需要跟踪您看到的最后“小时”值。请记住,传递给takeWhile的
谓词
是一个对象,因此可以将状态保存在其中。它看起来像这样:

cancellationRules.takeWhile(new Predicate<CancellationRule> {
    private int previousHours = Integer.MAX_VALUE;
    public boolean test(CancellationRule rule) {
        boolean result = rule.hours >= 24 || previousHours >= 24;
        previousHours = rule.hours;
        return result;
    }
});
cancellationRules.takeWhile(新谓词{
private int previousHours=Integer.MAX_值;
公共布尔测试(取消规则){
布尔结果=rule.hours>=24 | | previousHours>=24;
previousHours=rule.hours;
返回结果;
}
});

所以。。。你已经试过了。你试过什么?就像你说的12到48小时是10%的取消费。因此,超过一天意味着超过24小时。因此,您需要检查大于12小时作为您的条件,因为这种情况下,您的时间是12小时,如JSON中所示。如果有太多取消规则,筛选它们需要多个核心和并行流,则此业务存在工程无法解决的问题。:-)