簡體   English   中英

Java Stream Sort-具有2個或更多對象標准的比較器

[英]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(...)

我在此論壇示例中也提到了許多主題-Link1 Link2

代碼 (這對於單個條件非常有效)

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.

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