【发布时间】:2017-08-02 10:28:08
【问题描述】:
基于某些条件,我已从 MongoDB 读取数据并创建了带有结果集的 List<Document>。
List<Document> documentList = new ArrayList<Document>();
示例记录如下:
documentList: [
Document{
{ _id=5975ff00a213745b5e1a8ed9,
u_id=,
visblty = 1,
c_id=5975ff00a213745b5e1a8ed8,
batchid=null,
pdate=Tue Jul 11 17:52:25 IST 2017,
locale=en_US,
subject = "Document2"
} },
Document{
{ _id=597608aba213742554f537a6,
u_id=,
visblty = 1,
c_id=597608aba213742554f537a3,
batchid=null,
pdate=Fri Jul 28 01:26:22 IST 2017,
locale=en_US,
subject = "Document2"
} }
]
使用这个documentList,我再次使用一些条件进行过滤,然后我需要根据一些条件对过滤记录进行排序(我将收到请求)。
List<Document> outList = documentList.stream()
.filter(d -> d.getInteger("visblty") == 1
&& (!StringUtils.isEmpty(req.pdate())? (d.getDate(CommonConstants.PDATE).after(afterDate)): true)
&& (!StringUtils.isEmpty(req.pdate())? (d.getDate(CommonConstants.PDATE).before(beforeDate)): true)
.sorted().skip(4).limit()
.collect(Collectors.toList());
不确定如何排序(动态需要根据输入更改排序顺序,看起来像“pdate by DESC”或“subject by ASC"”)
点赞:"order by pdate DESC" or "order by pdate ASC"" or "order by subject DESC"
如何使用 Document 类的 Comparator 对象进行排序。
注意:我已经尝试了人们建议的几种方法,但我还没有得到任何运气。 提前谢谢!
【问题讨论】:
-
(!condition1? condition2: true)是condition1 || condition2的混淆变体。您可以通过在&&组合的两个术语中重复condition1来最大化它。整个过滤谓词可以简化为.filter( d -> d.getInteger("visblty")==1 && (StringUtils.isEmpty(req.pdate()) || d.getDate(CommonConstants.PDATE).after(afterDate)&&d.getDate(CommonConstants.PDATE) .before(beforeDate)) )。不过,StringUtils.isEmpty(req.pdate())不依赖于实际的流元素,因此,甚至可以在流操作之前进行评估,而不是针对每个元素。 -
我看到你的过滤器 lambda 变得非常大。我建议您将其拆分并使用function composition 将这些部分添加在一起。
-
@MProkhorov:它又大又多余……我不知道它使用哪个日期类,但也许
before和after的组合可以被between调用替换。然后,代码就像.filter(d -> d.getInteger("visblty")==1) .filter(d -> StringUtils.isEmpty(req.pdate()) || d.getDate(CommonConstants.PDATE).between(beforeDate, afterDate)) -
@Holger,是的,即使这样更好(在正确格式化 c 之后),根本不需要编写函数。
标签: java sorting java-8 java-stream