我想过滤,然后排序,然后限制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);
}
谢谢!
答案 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
不应该是这类参数的合法价值。