in src/main/java/net/hydromatic/linq4j/function/Functions.java [335:367]
public static <E> List<E> filter(List<E> list, Predicate1<E> predicate) {
sniff:
{
int hitCount = 0;
int missCount = 0;
for (E e : list) {
if (predicate.apply(e)) {
if (missCount > 0) {
break sniff;
}
++hitCount;
} else {
if (hitCount > 0) {
break sniff;
}
++missCount;
}
}
if (hitCount == 0) {
return Collections.emptyList();
}
if (missCount == 0) {
return list;
}
}
final List<E> list2 = new ArrayList<E>(list.size());
for (E e : list) {
if (predicate.apply(e)) {
list2.add(e);
}
}
return list2;
}