你如何创建一个收集到com.google.common.collect.ImmutableSet的java.util.stream.Collector?

gvl*_*sov 6 java guava java-8 collectors

这对我来说似乎太棘手了,因为ImmutableSet实例只是用ImmutableSet.Builder实例构建的,没有实现,Collection所以你不能只使用Collectors.toCollection(ImmutableSet::new)或Collectors.toCollection(ImmutableSet.Builder::new).

sbr*_*ges 6

这是内置番石榴,

ImmutableSet#toImmutableSet

使用像,

something.stream().collect(ImmutableSet.toImmutableSet())
Run Code Online (Sandbox Code Playgroud)


Ale*_* C. 5

实际上,在 :-) 3 个月之后,您可以使用Collector.of它并将其包装在一个简单的实用程序方法中,而不是为此定义一个完整的类:

public static <T> Collector<T, Builder<T>, ImmutableSet<T>> immutableSetCollector() {
    return Collector.of(Builder<T>::new, Builder<T>::add, (s, r) -> s.addAll(r.build()), Builder<T>::build);
}
Run Code Online (Sandbox Code Playgroud)

进而:

import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSet.Builder;
....

ImmutableSet<Point2D> set = 
    Stream.of(new Point2D(1, 2), ...).collect(immutableSetCollector());
Run Code Online (Sandbox Code Playgroud)