我是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(中找到示例解决方案。