我在为Ordering创建泛型方法时遇到了很大的问题。此刻我有这个功能:
public <T> T orderAscending(Function<?, ? extends Comparable> function, Iterable<? extends LinkedList<?>> sortingList) {
return Ordering.natural().onResultOf(function).sortedCopy(sortingList);
}
此功能的第一个参数以这种方式创建:
public static Function<ParkingWebApiDTO, Date> getSortActiveParkingsByStartDate() {
Function<ParkingWebApiDTO, Date> getStartDateFunction = new Function<ParkingWebApiDTO, Date>() {
@Override
public Date apply(ParkingWebApiDTO parkingWebApiDTO) {
return parkingWebApiDTO.getStartDate();
}
};
return getStartDateFunction;
}
,第二个是LinkedList,其中包含一些自定义对象(List<MyObject> test = new LinkedList<MyObject>()
)。
请有人帮我修复此通用方法orderAscending
。非常感谢您的帮助。
答案 0 :(得分:1)
我想你的意思是从你的DTO的List
创建Iterable
(按开始日期排序)(我假设你不想要迭代的DTO列表)。
所以让我们说你的DTO看起来像这样:
interface ParkingWebApiDTO { // could be simple class, etc.
Date getStartDate();
// ...and more methods here
}
您有输入列表:
LinkedList<? extends ParkingWebApiDTO> iterable = Lists.newLinkedList();
和从DTO检索开始日期的函数:
Function<ParkingWebApiDTO, Date> function = new Function<ParkingWebApiDTO, Date>() {
@Override
public Date apply(ParkingWebApiDTO dto) {
return dto.getStartDate();
}
};
你希望输出如下:
List<? extends ParkingWebApiDTO> result = orderAscending(function, iterable);
可以通过跟随orderAscending
实施:
public static <X, T extends Comparable<T>> List<? extends X> orderAscending(
Function<X, T> function, Iterable<? extends X> sortingList) {
return Ordering.natural().onResultOf(function).sortedCopy(sortingList);
}
如果要使用“通用”方法,则需要将类型和类型都声明为泛型类型。
另一件事是,如果你真的需要拥有这样的通用名称,因为使用Ordering.natural().onResultOf(function).sortedCopy(list)
非常好并且orderAscending
是IMO矫枉过正(你会以充足的方式结束)像这样的方法。)