Java 8 Java8从集合中提取对象的方法是什么?

Java 8 Java8从集合中提取对象的方法是什么?,java-8,closures,Java 8,Closures,我想从集合中提取一个项,并基于谓词保留它。看起来这确实是可能的,但我找不到一种方法来阻止我两次浏览这个列表。这样的操作可用于根据动态优先级“弹出”对象 也许我应该使用迭代器 下面是一个例子: import org.junit.Test; import java.util.Arrays; import java.util.HashSet; import java.util.Set; public class RemoveAndUse { class A { int x

我想从集合中提取一个项,并基于谓词保留它。看起来这确实是可能的,但我找不到一种方法来阻止我两次浏览这个列表。这样的操作可用于根据动态优先级“弹出”对象

也许我应该使用迭代器

下面是一个例子:

import org.junit.Test;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class RemoveAndUse {

    class A {
        int x;
        A(int x) { this.x = x;}
    }

    class B {
        int y;
        B(int y) { this.y = y;}
    }

    @Test
    public void removeHappyPath() {
        Set<A> aList = new HashSet<>(Arrays.asList(new A(1), new A(2), new A(3)));
        B b = new B(2);

        // remove and keep an A that matches b
        A found = aList.stream()
                .filter( a -> a.x == b.y )
                .findAny().get();

        aList.removeIf( a -> a.x == b.y);
        // or: aList.remove(found);

        assert(!aList.contains(found));
        assert(found.x == b.y);

    }
}
import org.junit.Test;
导入java.util.array;
导入java.util.HashSet;
导入java.util.Set;
公共类删除延迟{
甲级{
int x;
A(intx){this.x=x;}
}
B类{
int-y;
B(inty){this.y=y;}
}
@试验
public void removeHappyPath(){
Set aList=新的HashSet(Arrays.asList(新的A(1)、新的A(2)、新的A(3));
B=新的B(2);
//移除并保留与b匹配的A
A found=aList.stream()
.过滤器(a->a.x==b.y)
.findAny().get();
列表移除(a->a.x==b.y);
//或:aList.remove(找到);
断言(!aList.contains(found));
断言(find.x==b.y);
}
}
还有其他想法吗?

A找到了;
A found;
for (Iterator<A> it = aList.iterator();it.hasNext();) {
  A a = it.next();
  if (a.x == b.y) {
    found = a;
    it.remove();
    break;
  }
}
for(Iterator it=aList.Iterator();it.hasNext();){ A=it.next(); 如果(a.x==b.y){ 发现=a; it.remove(); 打破 } }

O(n)是有保证的

您还应该检查是否存在这样的元素。可能集合A不包含任何B。是的,迭代器可以工作。但是,我想知道是否有使用lambda特性的解决方案。然后我可以创建一个通用的“pop”,如果您有一个合适的hashcode/equals实现,那么remove需要一个
HashSet
的固定时间,因此调用
aList.remove(found)
就可以了。