web-dev-qa-db-ja.com

Java 8 2つのフィールドを使用してソート

いくつかの条件に基づいて、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オブジェクトを使用してソートする方法。

注:人々から提案されたいくつかの方法を試しましたが、まだ運がありませんでした。前もって感謝します!

10
Bharathiraja S

グループコンパレータとパラレルストリームを次のように使用できます。

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

.sorted()の代わりに.sorted(Comparator comparator)メソッドを使用してみてください。

.sorted(comparator)を使用して、Comparator.comparing()で使用されるComparatorを作成できます。

_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());
_

この例では、d -> d.getPdate()d -> d.getSubject()などのラムダ式の代わりに、メソッド参照_Document::getPdate_および_Document::getSubject_を使用できます。

5
Szymon Stepniak