を与えます削除された型を返すチェックされていない操作へのストリームチェーンの一般的な呼び出しであり、これは端末collect
呼び出しの場合はObject
です。右のタイプを使用して
は
、これはすなわち
List<String> fields=Arrays.asList("foo", "bar", "baz", "foo");
CopyOnWriteArrayList<String> l =
fields.stream()
.distinct()
.collect(Collectors.toCollection(CopyOnWriteArrayList::new));
作品、問題なく動作します。しかし、CopyOnWriteArrayList
をこのように構築することは、「コピーオンライト」という名前が既に示唆しているように、かなり高価であることに注意してください。各挿入時に内容全体をコピーすると、二次的な時間の複雑さが生じます。
解決策は、目的のターゲットタイプに変換する前に、増分ビルディングに適した一時コレクションに収集することです。このコピー手順はオーバーヘッドのように見えるかもしれませんが、CopyOnWriteArrayList
に直接収集する複雑さは、二次と比べて、のリバースのオーバーヘッドです。
CopyOnWriteArrayList<String> l =
fields.stream()
.distinct()
.collect(Collectors.collectingAndThen(
Collectors.toList(), CopyOnWriteArrayList::new));
この特定の場合、distinct
で暗黙的に舞台裏Set
を構築しますので、我々は一時的List
の代わりに明示的Set
を構築することにより、パフォーマンスを向上させ、distinct
ステップを削除できることに注意してください:
CopyOnWriteArrayList<String> l =
fields.stream()
.collect(Collectors.collectingAndThen(
Collectors.toCollection(LinkedHashSet::new),
CopyOnWriteArrayList::new));
この具体的な使用例では、すべてをより単純で潜在的により効率的にすることができるという結論に至ります。
CopyOnWriteArrayList<String> l = new CopyOnWriteArrayList<>(new LinkedHashSet<>(fields));
ちょうど推測:たぶんあなたは 'コレクションのようなタイプヒントが必要です。 toCollection() 'などです。そして、なぜそれが下落されたのかというアイデア。それを修正するために私の一部でした。 –
GhostCat
ヘルプがありません。ここにいくつかの文字があります。 – Seppo420
あなたのフィールドの変数は何ですか? –