作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试根据谓词过滤集合:
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 中看到了它。
我的过滤器操作有误吗?
最佳答案
你真的不应该做这样的事情:
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/
我无法在附加行中显示“真”、“假”、"is"和“否”按钮。 我在这里有一个应用程序:Application 请按照以下步骤使用应用程序: 1。当你打开应用程序时,你会看到一个绿色的加号按钮,点击 在此
我是一名优秀的程序员,十分优秀!