我想根据谓词筛选java.util.Collection。
当前回答
使用java 8,特别是lambda表达式,你可以像下面的例子那样简单:
myProducts.stream().filter(prod -> prod.price>10).collect(Collectors.toList())
其中,对于myProducts集合中的每个产品,如果prodc .price>10,则将该产品添加到新的过滤列表中。
其他回答
从Java 8的早期发行版开始,你可以尝试这样做:
Collection<T> collection = ...;
Stream<T> stream = collection.stream().filter(...);
例如,如果你有一个整数列表,你想过滤> 10的数字,然后将这些数字打印到控制台,你可以这样做:
List<Integer> numbers = Arrays.asList(12, 74, 5, 8, 16);
numbers.stream().filter(n -> n > 10).forEach(System.out::println);
您确定要筛选Collection本身,而不是迭代器吗?
看到org.apache.commons.collections.iterators.FilterIterator
或者使用apache commons的第四版org.apache.commons.collections4.iterators.FilterIterator
这里有一些非常棒的答案。对我来说,我想让事情尽可能简单易懂:
public abstract class AbstractFilter<T> {
/**
* Method that returns whether an item is to be included or not.
* @param item an item from the given collection.
* @return true if this item is to be included in the collection, false in case it has to be removed.
*/
protected abstract boolean excludeItem(T item);
public void filter(Collection<T> collection) {
if (CollectionUtils.isNotEmpty(collection)) {
Iterator<T> iterator = collection.iterator();
while (iterator.hasNext()) {
if (excludeItem(iterator.next())) {
iterator.remove();
}
}
}
}
}
设置:
public interface Predicate<T> {
public boolean filter(T t);
}
void filterCollection(Collection<T> col, Predicate<T> predicate) {
for (Iterator i = col.iterator(); i.hasNext();) {
T obj = i.next();
if (predicate.filter(obj)) {
i.remove();
}
}
}
的用法:
List<MyObject> myList = ...;
filterCollection(myList, new Predicate<MyObject>() {
public boolean filter(MyObject obj) {
return obj.shouldFilter();
}
});
谷歌的Guava库中的Collections2.filter(Collection,Predicate)方法正是您所寻找的。
推荐文章
- 在log4j中,在记录日志之前检查isDebugEnabled是否能提高性能?
- 没有JAXB生成的@XmlRootElement
- Java中对象的内存消耗是多少?
- 获取Spring应用程序背景信息
- 为什么在Java中使用静态嵌套接口?
- @Mock, @MockBean和Mockito.mock()的区别
- JDK 8中的PermGen消除
- 如何将CharSequence转换为字符串?
- 在Java中初始化一个long
- Java的数组indexOf在哪里?
- 同一个键下的多个值
- 使用JSTL检查集合大小
- Java“虚拟机”vs. Python“解释器”的说法?
- 获取操作系统级别的系统信息
- 如何通过SFTP从服务器检索文件?