根据一些条件,我从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对象进行排序。
注意:我尝试了一些人们建议的方法,但我还没有运气。 提前谢谢!
答案 0 :(得分:23)
您可以按如下方式使用组比较器和并行流:
List<Document> outList = documentList.stream()
.filter(....)
.sorted(Comparator.comparing(Document::getPdate)
.thenComparing(Document::getSubject))
.parallel();
答案 1 :(得分:12)
就Java代码而言,等效排序比较器如下所示:
order by pdate
由
表示Comparator.comparing(Document::getPDate)
order by subject
由
表示Comparator.comparing(Document::getSubject)
order by pdate, subject
代表:
Comparator.comparing(Document::getPDate).thenComparing(Document::getSubject)
如果您在任何时候需要降序,可以在比较器上调用reversed()
,如下所示:
Comparator.comparing(Document::getPDate).reversed()
.thenComparing(Comparator.comparing(Document::getSubject).reversed())
注意,thenComparing
方法被覆盖,提供传入的能力:
Comparable
都有效)Comparable
,因此您无法使用其自然顺序,必须指定应如何比较。答案 2 :(得分:5)
而不是.sorted()
尝试使用.sorted(Comparator comparator)
方法。
您可以使用Comparator
创建与.sorted(comparator)
一起使用的Comparator.comparing()
:
Comparator.comparing(Function keyExtractor)
.reversed()
.thenComparing(Function keyExtractor)
例如:
List<Document> outList = documentList.stream()
// do your filtering here
.sorted(Comparator.comparing(Document::getPdate).reversed()
.thenComparing(Document::getSubject))
.skip(4)
.limit()
.collect(Collectors.toList());
在此示例中,您可以使用方法引用Document::getPdate
和Document::getSubject
代替lambda表达式,例如d -> d.getPdate()
和d -> d.getSubject()