如何在 Java 中对通配符列表进行排序



我是Java Streams的新手,我想对列表进行排序。 该列表的类型为:

List<? extends PositionType> positions

我想根据我们按升序将每个PositionType对象转换为子类ConvertedPosition的字段对这个列表进行排序。

到目前为止,我已经尝试过这个:

List<ConvertedPosition> sortedPositions = positions.stream()
.sorted(Comparator.comparingInt(((ConvertedPosition)PositionType::getPnlSpn()))
.collect(Collectors.toList());

但是我收到编译错误:

The method comparingInt(ToIntFunction<? super T>) in the type Comparator is not applicable for the arguments (ConvertedPosition)
The target type of this expression must be a functional interface

我非常不鼓励当前使用类型转换的尝试。如果列表中有不属于ConvertedPosition类型的项目怎么办?

如果丢弃不属于ConvertedPosition类型的项目是可行的,那么我会建议对所呈现的代码进行以下扩展:

List<ConvertedPosition> sortedPositions = positions.stream()
.filter(e -> e instance ConvertedPosition) // filter out all non-ConvertedPosition items
.map(e -> (ConvertedPosition) e)           // cast is safe due to the previous filter
.sorted(Comparator.comparingInt(PositionType::getPnlSpn()))
.collect(Collectors.toList());

Ideone 示例 (1(

如果丢弃非ConvertedPosition项目不是一种选择,也有可能编写某种转换器。Yon 可以在此Ideone 示例 (2(中找到示例解决方案。

最新更新