gpt4 book ai didi

java - collections.filter 会错吗?

转载 作者:行者123 更新时间:2023-12-01 17:05:40 24 4
gpt4 key购买 nike

我尝试根据谓词过滤集合:

                private void filterExpiredOffers() {
mOffersList = Lists.newArrayList(Collections2.filter(
mOffersList, new Predicate<Offer>() {
@Override
public boolean apply(Offer offer) {
return mUnlockExpirationCalculator
.isUnlockValid(offer);
}
}));
}

和:

public boolean isUnlockValid(Offer offer) {
return ((offer.unlockExpirationDate == null) || (System
.currentTimeMillis() < offer.unlockExpirationDate.getTime()));
}

我发现报价结果为“错误”

但是,我稍后在 arrayList 中看到了它。

我的过滤器操作有误吗?

enter image description here

最佳答案

你真的不应该做这样的事情:

public boolean isUnlockValid(Offer offer) {
return ((offer.unlockExpirationDate == null) || (System
.currentTimeMillis() < offer.unlockExpirationDate.getTime()));
}

创建一个类实例,捕获并使用 System.currentTimeMillis()。这样您的过滤器将随着时间的推移保持稳定。

考虑这样的事情

class UnlockValidPredicate implements Predicate<Offer> {
public UnlockValidPredicate() {
this(System.currentTimeMillis());
}

public UnlockValidPredicate(long millis) {
this.millis = millis;
}

@Overrride public boolean apply(Offer offer) {
return offer.unlockExpirationDate == null
|| millis < offer.unlockExpirationDate.getTime();
}

private final long millis;
}

还要考虑删除 null。将 unlockExpirationDate 设置为 new Date(Long.MAX_VALUE) 足以实现“永不过期”,不是吗?

That's not it. The current time was Sep 7th. The unlockExpirationDate was Aug 30th. It's not a matter of days between the filtering and the debugging i did. what else can it be?

<小时/>

摆脱Date,它是愚蠢的可变类。 很可能,您以某种方式更改了它。诸如此类的事情

 MyClass(Date date) {
this.date = date;
}

 Date getDate() {
return date;
}

是灾难的根源。最好的解决方案是使用不可变类(Java 8 或 JodaTime 中提供)。第二个最好的方法是使用long millis。最后是在各处克隆Date

关于java - collections.filter 会错吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25705266/

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