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

标签 java java-stream comparator

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

在这种情况下,如果我执行以下操作,IntelliJ IDE 会立即给出错误消息 - 'Cannot resolve method 'get(int)' for 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());

已添加(对象的详细信息)

(注)

字符串数据类型 - exchange、broker、segment、coCode

LocalDate 数据类型 - 贸易日期

本地时间数据类型 - 交易时间

双数据类型 - 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()));

关于Java Stream Sort - 具有 2 个或更多对象条件的比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47388314/

相关文章:

java - 如何将 for-each 循环重写为流?

java - 尝试为给定字段上的给定类创建比较器时出错

java - 为什么我的 @BeforeClass 方法在执行子类测试方法时不运行?

Java 8 Iterable.forEach() 与 foreach 循环

Java lambda 循环

java - Comparable 比较器 Java

c++ - 删除重复项而不四舍五入,C++

java - GSON JsonReader 给我值而不是名称?

java - 继承具有覆盖等效签名的方法

Java Bean Validation (JSR303) 约束涉及多个 bean 属性之间的关系