如何从guava集合中更改ImmutableSet?

vbe*_*nar 2 java collections immutability guava

我有一个ImmutableSet的实例.现在我需要包含该集合中除了一个之外的所有元素的新实例.就像是

ImmutableSet<Integer> numbers = ImmutableSet.of(2, 3, 4, 5);
ImmutableSet<Integer> primeNumbers = numbers.remove(4);
Run Code Online (Sandbox Code Playgroud)

但是这个代码当然甚至都没有编译.我能做到的唯一方法是:

ImmutableSet<Integer> numbers = ImmutableSet.of(2, 3, 4, 5);
ImmutableSet.Builder<Integer> primeNumbersBuilder = new ImmutableSet.Builder<>();
for (Integer number : numbers) {
    if (number != 4) {
        primeNumbersBuilder.add(number);
    }
}
ImmutableSet<Integer> primeNumbers = primeNumbersBuilder.build();
Run Code Online (Sandbox Code Playgroud)

但这看起来很丑陋,可能没那么高效.

我在其他语言中看到的所有不可变集合通常提供了一种执行可变操作的方法,返回新实例.番石榴有这个功能吗?

SMA*_*SMA 6

你得到编译错误,因为numbers.remove方法返回你的布尔值.顺便说一句,Btw Guava不允许你在Immutable set中添加或删除元素.

您可以执行以下操作:

 numbers = ImmutableSet.copyOf(Sets.difference(numbers, ImmutableSet.of(4)); its like set1-set2 and creating new numbers after removing 4.
 Output
 [2, 3, 5] 
Run Code Online (Sandbox Code Playgroud)


Fra*_*eau 5

工厂方法builder()CollectionGuava实现的唯一补充,正如您在Javadoc中看到的那样.

另一种更流畅的解决方案是使用FluentIterable:

ImmutableSet<Integer> primeNumbers = FluentIterable.from(numbers)
        .filter(Predicates.not(Predicates.equalTo(4)))
        .toSet();
Run Code Online (Sandbox Code Playgroud)

或者,使用静态导入:

ImmutableSet<Integer> primeNumbers = FluentIterable.from(numbers)
        .filter(not(equalTo(4)))
        .toSet();
Run Code Online (Sandbox Code Playgroud)