在Java中过滤,排序和限制不可修改的列表

时间:2014-09-08 20:28:07

标签: java sorting filter limit guava

我想过滤,然后排序,然后限制Java和Guava中的不可修改列表。有没有比下面更有效的聪明方法呢?

public static <T> List<T> execute(final List<T> list, final Predicate<? super T> filter, final Comparator<? super T> sort, final Integer limit) {
    final List<T> newList = Lists.newArrayList(Iterables.filter(list, filter));
    Collections.sort(newList, sort);

    if (limit > newList.size()) {
        return newList;
    }
    return newList.subList(0, limit);
}

谢谢!

3 个答案:

答案 0 :(得分:4)

if (limit != null) {
    return newList.subList(0, limit);
}

每当limit > newList.size()时都会打击。

我想,只有一件事可以优化:如果你只想要它的一部分,你不必对整个集合进行排序。这样做是a bit complicated,所以如果你真的需要它,你应该先测量它。


如评论中所述,它实际上很容易,因为Guava已经这样做了:

public static <T> List<T> execute(
        final List<T> list,
        final Predicate<? super T> filter,
        final Comparator<? super T> sort,
        final Integer limit) {
    final FluentIterable<T> filtered = FluentIterable.from(list).filter(filter);
    return Ordering.from(sort).leastOf(filtered, limit);
}

答案 1 :(得分:4)

List<T> newList = FluentIterable.from(list)
    .filter(predicate)
    .limit(limit)
    .toSortedList(comparator);
// (This sorts last so is behaviorally different from the original example, but it
//  gives an idea of a somewhat more readable approach to this type of thing.)

// Java 8's Stream, unlike Guava's FluentIterable, has a sort method which
// makes this easier:
List<T> newList = list.stream()
    .filter(predicate)
    .sort(comparator)
    .limit(limit)
    .collect(toList());

只需使用代替您的execute方法,如果您没有要过滤的谓词,请不要调用filter。注意如何很清楚当你查看代码时正在做什么。将其与:

进行比较
List<T> newList = execute(list, predicate, comparator, limit);

甚至更糟:

List<T> newList = execute(list, null, comparator, null);

定义这样的单个方法只会混淆代码。

答案 2 :(得分:2)

您的测试使事情变得非常复杂......如果您希望用户能够在不使用过滤器的情况下调用此方法(例如),则只需重载您的方法。 null不应该是这类参数的合法价值。