3 回答
TA贡献1998条经验 获得超6个赞
看来您首先需要以相反的顺序排序,以便您感兴趣的元素成为第一个:
myList.stream() .sorted(Comparator.comparing(MyObject::getDate, Comparator.reverseOrder())) .skip(1) .forEach(x -> x.setActive("0"))
然后跳过它,将其他设置为0
.
TA贡献1873条经验 获得超9个赞
无需排序。只需通过比较日期属性找到 max( recent ) 对象。
MyObject recent = Collections.max(list,Comparator.comparing(MyObject::getDate));
list.stream().filter(myObject -> !myObject.equals(recent))
.forEach(myObject -> myObject.setActive("0"));
TA贡献1804条经验 获得超7个赞
编辑:此处显示的方法可能会被视为对Stream.map操作的滥用,即使在实践中它始终有效(在帖子的初始版本末尾有最后注释的警告)。
请参阅附录以获得更简洁的方法。
没有必要进行任何排序(这是一个O(NlogN)操作),当您所要做的就是找到具有最大日期的元素。
您可以流式传输MyObject元素列表,停用所有元素,然后找到具有最大日期的元素,最后激活它:
myList.stream()
.map(myObject -> { myObject.setActive("0"); return myObject; })
.max(Comparator.comparing(MyObject::getDate))
.ifPresent(myObject -> myObject.setActive("1"));
如果MyObject该类具有流利的方法来设置active属性,则此代码会读得更好:
public MyObject activated() {
active = "1";
return this;
}
public MyObject deactivated() {
active = "0";
return this;
}
现在解决方案将变成:
myList.stream()
.map(MyObject::deactivated)
.max(Comparator.comparing(MyObject::getDate))
.ifPresent(MyObject::activated);
注意:如果流的源将自身报告为已排序,则此方法可能不起作用。当您使用列表时,这不会发生。
附录:
正如评论中所讨论的,最干净的方法是将所有元素设置为非活动状态,然后找到具有最大日期的元素并将其设置为活动状态:
myList.forEach(myObject -> myObject.setActive("0"));
myList.stream()
.max(Comparator.comparing(MyObject::getDate))
.ifPresent(myObject -> myObject.setActive("1"));
或者使用流畅的方法:
myList.forEach(MyObject::deactivated);
myList.stream()
.max(Comparator.comparing(MyObject::getDate))
.ifPresent(MyObject::activated);
当然,这种方式需要对列表进行 2 次传递,但它清楚地表明了开发者的意图,并没有滥用流 API。
最后一个片段的一个变体可能是:
myList.forEach(MyObject::deactivated);
if (!myList.isEmpty())
Collections.max(myList, Comparator.comparing(MyObject::getDate))
.activated();
添加回答
举报