[英]Java Stream Sort - Comparator with 2 or more Criteria for Objects
問題:我試圖檢查是否可以使用2個或更多條件對列表(數據類型為Object的ArrayList)進行排序。 請注意,我知道將Comparator與thenComparing功能一起使用。 我希望檢查是否有一種方法可以對2個或更多條件進行排序,而不必使用自定義數據類型,從而可以輕松使用比較器功能。 對於1個條件排序,以下代碼適用。
在這種情況下,如果我執行以下操作,則IntelliJ IDE會立即顯示錯誤消息-'無法解析o.get(3)的方法'get(int)'
.sorted(Comparator.comparing(o -> o.get(3).toString()).thenComparing(...)
代碼 (這對於單個條件非常有效)
List<List<Object>> listOutput = new ArrayList<>();
.........
.........
listOutput = listOutput
.stream()
.sorted(Comparator.comparing(o -> o.get(3).toString()))
.collect(Collectors.toList());
已添加 (對象詳細信息)
(注意)
字符串數據類型-交易所,經紀人,細分,共同代碼
LocalDate數據類型-tradeDate
LocalTime數據類型-tradeTime
double dataType-賣方價格,買方價格
List<Object> lineOutput = new ArrayList<>();
lineOutput.add(exchange);
lineOutput.add(broker);
lineOutput.add(segment);
lineOutput.add(tradeDate); // Entry Date
lineOutput.add(tradeTime); // Entry Time
lineOutput.add(coCode);
lineOutput.add(sellPrice - buyPrice); // Profit / Loss
listOutput.add(lineOutput); // Add line to Output
看來編譯器無法推斷出正確的類型(我試過javac 8和9具有相同的效果)。 我可以使之起作用的唯一方法是直接通過強制轉換指定類型:
list.stream()
.sorted(
Comparator.comparing((List<Object> o) -> o.get(3).toString())
.thenComparing((List<Object> x) -> x.get(3).toString()));
我也遇到過幾次這些問題,尤其是在使用Comparator時。
Eclipse和/或Java編譯器在正確推斷類型時遇到麻煩
。 正如Holger指出的那樣,這不是錯誤,而是按指定的方式工作:比較器中的類型不能僅通過sorted
參數的預期類型來推斷。 您必須手動/明確輸入以提供足夠的信息來進行編譯:
List<List<Object>> listOutput = new ArrayList<>();
listOutput = listOutput.stream()
.sorted(Comparator.comparing((List<Object> o) -> o.get(3).toString())
.thenComparing(o -> o.get(2).toString()))
.collect(Collectors.toList());
然后在隨后的thenComparing
正確識別類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.