订购的番石榴通用

时间:2014-09-15 11:48:50

标签: java generics collections guava

我在为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。非常感谢您的帮助。

1 个答案:

答案 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矫枉过正(你会以充足的方式结束)像这样的方法。)