Based one some conditions, I have read data from MongoDB and creating a List<Document> with resultset.
List<Document> documentList = new ArrayList<Document>();
Sample Record Looks like:
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"
} }
]
Using this documentList, again i am filtering using some conditions and then I need to sort the filter record based on some conditions (which I will get in request).
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());
Not sure how to sorted (Dynamically needs to change the sorting order based on input, it looks like "pdate by DESC" or "subject by ASC")
Like: "order by pdate DESC" or "order by pdate ASC"" or "order by subject DESC"
How to sort using Comparator object of Document class.
Note: I have tried couple of method which was suggested by the folks, but I didn't get any luck yet. Thank you in advance!
(!condition1? condition2: true)is an obfuscated variant ofcondition1 || condition2. You are maxing that out by repeatingcondition1in two terms combined via&&. The entire filter predicate can be simplified to.filter( d -> d.getInteger("visblty")==1 && (StringUtils.isEmpty(req.pdate()) || d.getDate(CommonConstants.PDATE).after(afterDate)&&d.getDate(CommonConstants.PDATE) .before(beforeDate)) ). Though,StringUtils.isEmpty(req.pdate())does not depend on the actual stream element, hence, could be even evaluated before the stream operation, rather than for each element.beforeandaftercould be replaced by abetweencall. Then, the code would be as simple as.filter(d -> d.getInteger("visblty")==1) .filter(d -> StringUtils.isEmpty(req.pdate()) || d.getDate(CommonConstants.PDATE).between(beforeDate, afterDate))