提问者:小点点

java/番石榴-收集删除的元素从迭代[关闭]


想改进这个问题吗?更新问题,以便通过编辑这篇文章用事实和引用来回答。

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个答案

匿名用户

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

匿名用户

Collection. add()如果对add()的调用修改了集合,则返回true。因此,您可以像这样快捷键if/else分支:

Iterables.removeIf(list, new Predicate<Integer>() {
    public boolean apply(final Integer o) {
        return o <= 5 && removedItems.add(o);
    }
});

有了Java8,这就变成了

Iterables.removeIf(list, o -> o <= 5 && removedItems.add(o));

…甚至(没有番石榴):

list.removeIf(o -> o <= 5 && removedItems.add(o));

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

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

通过谓词对集合进行分区的库方法