ImmutableSet
インスタンスはインスタンスでのみ構築されImmutableSet.Builder
、実装されていないため、 orCollection
だけを使用できないため、これは私には難しすぎるようです。Collectors.toCollection(ImmutableSet::new)
Collectors.toCollection(ImmutableSet.Builder::new)
2111 次
6 に答える
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);
}
その後:
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSet.Builder;
....
ImmutableSet<Point2D> set =
Stream.of(new Point2D(1, 2), ...).collect(immutableSetCollector());
于 2015-03-12T19:12:08.193 に答える
2
インターフェイスを拡張することで、カスタム コレクターを作成できCollector
ます。
詳細については、次の堅実なリファレンスを参照してください: http://java.dzone.com/articles/introduction-writing-custom
于 2014-12-23T00:04:44.420 に答える
1
この機能は、guava-jdk8ライブラリー (私が作成したもの) ですぐに使用できます。
于 2015-12-29T10:44:32.703 に答える
1
これは私が見つけた最も近いものです:
Set<String> set = list.stream().collect(ImmutableSet.Builder<String>::new, ImmutableSet.Builder<String>::add, (builder1, builder2) -> builder1.addAll(builder2.build())).build();
あるビルダーの要素を別のビルダーに追加するメソッドはなく、Iterable または Iterator のみであるため、このメソッドの参照を使用することはできません。
于 2014-12-22T23:47:02.450 に答える
1
したがって、この場合のカスタム コレクターを作成することは、私が想像していたほど難しい作業ではないようです。
package org.tendiwa.collections;
import com.google.common.collect.ImmutableSet;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;
public class ImmutableSetCollector<T> implements Collector<T, ImmutableSet.Builder<T>, ImmutableSet<T>> {
@Override
public Supplier<ImmutableSet.Builder<T>> supplier() {
return ImmutableSet.Builder::new;
}
@Override
public BiConsumer<ImmutableSet.Builder<T>, T> accumulator() {
return (builder, element) -> builder.add(element);
}
@Override
public BinaryOperator<ImmutableSet.Builder<T>> combiner() {
return (b1, b2) -> b1.addAll(b2.build());
}
@Override
public Function<ImmutableSet.Builder<T>, ImmutableSet<T>> finisher() {
return ImmutableSet.Builder::build;
}
@Override
public Set<Characteristics> characteristics() {
return ImmutableSet.of();
}
}
使用法:
public static void main(String[] args) {
ImmutableSet<Point2D> set = Arrays.asList(
new Point2D(1, 2),
new Point2D(2, 4),
new Point2D(3, 5),
new Point2D(4, 4),
new Point2D(5, 6),
new Point2D(8, 6)
).stream().collect(new ImmutableSetCollector<>());
System.out.println(set);
}
出力:
[{1.0:2.0}, {2.0:4.0}, {3.0:5.0}, {4.0:4.0}, {5.0:6.0}, {8.0:6.0}]
于 2014-12-23T00:05:03.127 に答える