簡體   English   中英

使用可變方法參考的Java 8 Lambda排序

[英]Java 8 Lambda Sort With Variable Method Reference

我有一個聲明:

searchResults.sort(Comparator.comparing(WCCTableRowData::getD));

其中getD是WCCTableRowData類中的訪問器,searchResults是WCCTableRowData的列表。 WCCTableRowData類具有getA到getZ的訪問器。 我需要能夠從傳入的變量中動態設置排序字段。 有沒有一種優雅的方式來做到這一點,還是我需要一系列if語句或類似的?

更新1不幸的是,雖然我認為方向是正確的,但是接受的答案中的方法都不起作用。 通過方法2我得到:

智能感

使用方法1,row.getField不會在WCCTableRowData類中獲取getField方法,並且我得到類似的“不符合上限(s)”錯誤。 我認為錯誤是說WCCTableRowData類必須實現Comparable?

一種方法是將方法引用存儲在帶有鍵的映射中 - 變量的值。 它類似於switch語句。 你可以使用guava ImmutableMap.<WCCTableRowData, Comparable<?>>of()來使它更好一些。

更新

您可以明確告訴Comparator.comparing(...)構造的Comparator.comparing(...)器正在比較Comparable

Comparator.<WCCTableRowData, Comparable>comparing(getters.get(name));

您還可以存儲對象的比較器(聽起來更合理,但添加了樣板),而不是返回可比對象的函數:

Map<String, Comparator<WCCTableRowData>> comparators = new HashMap<>();
comparators.put("A", Comparator.comparing(WCCTableRowData::getX));
comparators.put("B", Comparator.comparing(WCCTableRowData::getY));

String name = "C";
searchResults.sort(comparators.get(name)); 

一種方法是在WCCTableRowData中添加一個方法,該方法可以給出一個字段名稱並返回該字段的值。

class WCCTableRowData {
    Comparable<?> getField(String name) { ... }
}

String name = "C";
searchResults.sort(Comparator.comparing(row -> row.getField(name)));

如果您不想修改類,則可以設置外部地圖。

Map<String, Function<WCCTableRowData, Comparable<?>>> getters = new HashMap<>();
getters.put("A", WCCTableRowData::getA);
getters.put("B", WCCTableRowData::getB);
getters.put("C", WCCTableRowData::getC);

String name = "C";
searchResults.sort(Comparator.comparing(getters.get(name)));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM