Java 流排序 - 具有 2 个或更多对象条件的比较器
Java Stream Sort - Comparator with 2 or more Criteria for Objects
问题: 我正在尝试检查是否可以使用 2 个或更多条件对列表(数据类型为对象的 ArrayList)进行排序。请注意,我知道将 Comparator 与 thenComparing 功能一起使用。我想检查是否有一种方法可以使用 2 个或更多条件进行排序 w/o 必须使用自定义数据类型,以便我可以轻松使用比较器功能。对于 1 个标准排序,以下代码有效。
在这种情况下,如果我执行以下操作,IntelliJ IDE 会立即给出一条错误消息 - 'Cannot resolve method 'get(int)' for o.get(3)
.sorted(Comparator.comparing(o -> o.get(3).toString()).thenComparing(...)
我也提到了这个论坛示例中的许多主题 - Link1
代码(这适用于单一条件)
List<List<Object>> listOutput = new ArrayList<>();
.........
.........
listOutput = listOutput
.stream()
.sorted(Comparator.comparing(o -> o.get(3).toString()))
.collect(Collectors.toList());
已添加(对象的详细信息)
(注)
字符串数据类型 - 交换、代理、段、coCode
LocalDate 数据类型 - tradeDate
本地时间数据类型 - 贸易时间
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
编译器似乎无法推断出正确的类型(我试过 javac 8 和 9,效果相同)。我能让它工作的唯一方法是直接通过转换指定类型:
list.stream()
.sorted(
Comparator.comparing((List<Object> o) -> o.get(3).toString())
.thenComparing((List<Object> x) -> x.get(3).toString()));
我也遇到过几次这些问题,尤其是比较器。 Eclipse and/or java 编译器无法正确推断类型。正如 Holger 所指出的,这不是错误,而是按规定工作:Comparator 中的类型不能仅通过 sorted
参数的预期类型来推断。你必须输入 manually/explicitly 来给它足够的信息来编译:
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
秒中,类型被正确识别。
问题: 我正在尝试检查是否可以使用 2 个或更多条件对列表(数据类型为对象的 ArrayList)进行排序。请注意,我知道将 Comparator 与 thenComparing 功能一起使用。我想检查是否有一种方法可以使用 2 个或更多条件进行排序 w/o 必须使用自定义数据类型,以便我可以轻松使用比较器功能。对于 1 个标准排序,以下代码有效。
在这种情况下,如果我执行以下操作,IntelliJ IDE 会立即给出一条错误消息 - 'Cannot resolve method 'get(int)' for o.get(3)
.sorted(Comparator.comparing(o -> o.get(3).toString()).thenComparing(...)
我也提到了这个论坛示例中的许多主题 - Link1
代码(这适用于单一条件)
List<List<Object>> listOutput = new ArrayList<>();
.........
.........
listOutput = listOutput
.stream()
.sorted(Comparator.comparing(o -> o.get(3).toString()))
.collect(Collectors.toList());
已添加(对象的详细信息)
(注)
字符串数据类型 - 交换、代理、段、coCode
LocalDate 数据类型 - tradeDate
本地时间数据类型 - 贸易时间
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
编译器似乎无法推断出正确的类型(我试过 javac 8 和 9,效果相同)。我能让它工作的唯一方法是直接通过转换指定类型:
list.stream()
.sorted(
Comparator.comparing((List<Object> o) -> o.get(3).toString())
.thenComparing((List<Object> x) -> x.get(3).toString()));
我也遇到过几次这些问题,尤其是比较器。 Eclipse and/or java 编译器无法正确推断类型。正如 Holger 所指出的,这不是错误,而是按规定工作:Comparator 中的类型不能仅通过 sorted
参数的预期类型来推断。你必须输入 manually/explicitly 来给它足够的信息来编译:
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
秒中,类型被正确识别。