Java Stream Sort - 具有2个或更多对象标准的比较器

时间:2017-11-20 09:05:28

标签: java java-stream comparator

问题:我正在尝试检查是否可以使用2个或更多条件对列表(数据类型为Object的ArrayList)进行排序。请注意我知道使用Comparator with thenComparing功能。我希望检查是否有一种方法可以使用2个或更多标准进行排序,而无需使用自定义数据类型,我可以轻松使用比较器功能。对于1个标准排序,以下代码可用。

在这种情况下如果我执行以下操作,IntelliJ IDE会立即显示错误 - '无法解析方法' get(int)'对于o.get(3)

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

已添加(对象详情)

(注)

String dataType - exchange,broker,segment,coCode

LocalDate dataType - tradeDate

LocalTime dataType - tradeTime

double dataType - sellPrice,buyPrice

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

2 个答案:

答案 0 :(得分:5)

似乎编译器无法推断出正确的类型(我尝试过javac 8和9具有相同的效果)。我能使它工作的唯一方法是直接通过强制转换来指定类型:

#portofolioGrid2

答案 1 :(得分:2)

我也曾多次遇到过这些问题,特别是对于比较器。 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中,可以正确识别该类型。