【问题标题】:How do I change ImmutableSet from guava collections?如何从番石榴集合中更改 ImmutableSet?
【发布时间】:2015-02-20 08:53:24
【问题描述】:

我有一个 ImmutableSet 的实例。现在我需要包含该集合中除一个之外的所有元素的新实例。类似的东西

ImmutableSet<Integer> numbers = ImmutableSet.of(2, 3, 4, 5);
ImmutableSet<Integer> primeNumbers = numbers.remove(4);

但是这段代码当然不能编译。我能做到的唯一方法是:

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

但这看起来很丑陋,而且可能效率不高。

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

【问题讨论】:

  • 你不能改变它,所以它叫Immutable
  • 不可变集合可能允许更改其内容,返回具有新内容的新对象。例如,查看 Scala 不可变集合。但是 Guava 没有这个功能,可能是因为 ImmutableXXX 集合的构建目的不同。

标签: java collections guava immutability


【解决方案1】:

工厂方法和builder() 是Guava 中Collection 实现的唯一添加,正如您可能在Javadoc 中看到的那样。

对于其他给出的解决方案,另一种更流畅的解决方案是使用FluentIterable

ImmutableSet<Integer> primeNumbers = FluentIterable.from(numbers)
        .filter(Predicates.not(Predicates.equalTo(4)))
        .toSet();

或者,使用静态导入:

ImmutableSet<Integer> primeNumbers = FluentIterable.from(numbers)
        .filter(not(equalTo(4)))
        .toSet();

【讨论】:

【解决方案2】:

你得到编译错误,因为numbers.remove 方法返回布尔值。顺便说一句,Guava 不允许您从 Immutable 集合中添加或删除元素,顾名思义。

你可以做如下操作:

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

【讨论】:

    【解决方案3】:

    您的结果集需要是 ImmutableSet 还是只是一个普通 Set?

    Guava 内置了过滤功能,但不是你想的那样

    ImmutableSet<Integer> numbers = ImmutableSet.of(2, 3, 4, 5);
    ImmutableSet filtered = ImmutableSet.copyOf(Sets.filter(orig, new Predicate<Integer>() {
        @Override
        public boolean apply(Integer input) {
            return input != 4;
        }
    }));
    System.out.println(filtered);
    

    【讨论】:

      【解决方案4】:

      从 ImmutableSet 获取 Set 的另一种方法是:

      Set<someClass> myMutableSet = Sets.newHashSet(someImmutableSet);
      

      https://guava-libraries.googlecode.com/svn/tags/release04/javadoc/com/google/common/collect/Sets.html#newHashSet(E...)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-04
        • 1970-01-01
        • 1970-01-01
        • 2013-08-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多