java / guava - 从iterable中收集已删除的元素

时间:2014-08-12 17:05:50

标签: java guava

在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);
}

谢谢!

编辑:我的问题不是分区列表,而是关于从集合中删除元素并同时收集它们。我编辑了我的问题以避免混淆。

2 个答案:

答案 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));

当然,不确定这一般是否会被认为更具可读性: - )

通过谓词对集合进行分区:

这里的问题从不同角度处理问题:

Library method to partition a collection by a predicate