Java 8使用2个字段排序

问题描述 投票:9回答:3

根据一些条件,我从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对象进行排序。

注意:我尝试了一些人们建议的方法,但我还没有运气。先感谢您!

java sorting java-8 java-stream
3个回答
23
投票

您可以使用组比较器和并行流,如下所示:

List<Document> outList = documentList.stream()
                               .filter(....)
                               .sorted(Comparator.comparing(Document::getPdate)
                                                 .thenComparing(Document::getSubject))   
                               .parallel();  

12
投票

就Java代码而言,等效排序比较器如下所示:

  1. order by pdate 由...代表 Comparator.comparing(Document::getPDate)
  2. order by subject 由...代表 Comparator.comparing(Document::getSubject)
  3. order by pdate, subject 代表人: Comparator.comparing(Document::getPDate).thenComparing(Document::getSubject)

如果在任何时候你需要降序,你可以在比较器上调用reversed(),如下所示:

Comparator.comparing(Document::getPDate).reversed()
          .thenComparing(Comparator.comparing(Document::getSubject).reversed())

请注意,thenComparing方法被覆盖,提供传入的能力:

  • a Comparator
  • a Function-extractor(无论函数提取的是什么-a Comparable都有效)
  • a Function and a Comparator(因为提取的值本身不是Comparable,所以你不能使用它的自然顺序,必须指定它应该如何比较。

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::getPdateDocument::getSubject而不是lambda表达式,如d -> d.getPdate()d -> d.getSubject()

© www.soinside.com 2019 - 2024. All rights reserved.