在Guava中是否有更优雅的方法可以删除符合某个集合中某个谓词的项目并同时收集这些删除的项目?请参阅下面的代码以获取示例。
public static void main(String[] a) {
final List<String> list = new LinkedList<String>();
list.add("...");
...
final List<String> removedItems = new LinkedList<String>();
Iterables.removeIf(list, new Predicate<String>() {
public boolean apply(final String o) {
if (...) { // some condition
removedItems.add(o);
return true;
}
return false;
}
});
System.out.println(removedItems);
}
谢谢!
编辑:我的问题不是分区列表,而是关于从集合中删除元素并同时收集它们。我编辑了我的问题以避免混淆。
答案 0 :(得分:1)
Predicate<Integer> predicate = new Predicate<>() {
public boolean apply(final Integer o) {
return o <= 5;
}
};
List<Integer> removed = Lists.newLinkedList(Iterables.filter(list, predicate));
Iterables.removeIf(list, predicate);
答案 1 :(得分:0)
Collection.add()
的调用修改了集合,则 add()
返回true。因此,您可以像这样快捷if
/ else
分支:
Iterables.removeIf(list, new Predicate<Integer>() {
public boolean apply(final Integer o) {
return o <= 5 && removedItems.add(o);
}
});
使用Java 8,这变为
Iterables.removeIf(list, o -> o <= 5 && removedItems.add(o));
......甚至(没有番石榴):
list.removeIf(o -> o <= 5 && removedItems.add(o));
当然,不确定这一般是否会被认为更具可读性: - )
这里的问题从不同角度处理问题: