2016-09-21 3 views
0

"互換性のないタイプ、必須:CopyOnWriteArrayList、found:Object"が次のようになっています。私はIntelliJ 2016.1.1を使用しています。CopyOnWriteArrayListにストリームを収集する方法

CopyOnWriteArrayList<Foo> l = fields.stream() 
            .distinct() 
            .collect(toCollection(CopyOnWriteArrayList::new)); 
+1

ちょうど推測:たぶんあなたは 'コレクションのようなタイプヒントが必要です。 toCollection() 'などです。そして、なぜそれが下落されたのかというアイデア。それを修正するために私の一部でした。 – GhostCat

+0

ヘルプがありません。ここにいくつかの文字があります。 – Seppo420

+0

あなたのフィールドの変数は何ですか? –

答えて

1

フィールドオブジェクトのような継ぎ目はFooタイプではありません。そうでない場合は、以下の作業コードを見つけることができます。

import java.util.ArrayList; 
import java.util.List; 
import java.util.concurrent.CopyOnWriteArrayList; 
import java.util.stream.Collectors; 

public class Foo { 


    private String name; 

    Foo(String name){ 

     this.name=name; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public String toString() { 
     return "Foo [name=" + name + "]"; 
    } 

    public static void main(String[] args) { 
     List<Foo> fields = new ArrayList<>(); 
     fields.add(new Foo("aa")); 
     fields.add(new Foo("bb")); 
     CopyOnWriteArrayList<Foo> l = fields.stream().distinct().collect(Collectors.toCollection(CopyOnWriteArrayList::new)); 

     System.out.println("l"+l); 
    } 


} 

PS:あなたのフィールドは、一般的な非であれば、またこれが生タイプ、変わりあり、問題はfieldsが最も可能性が高い不適切なタイプを、持っていることであるエラーに

1

を与えます削除された型を返すチェックされていない操作へのストリームチェーンの一般的な呼び出しであり、これは端末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)); 
関連する問題