2016-07-27 5 views
2

私はパラメータとしてObjectの機能を持っています。それはリストすることができ、マップ、反復可能、など、私はそれに属する各項目を処理したい場合には:このオブジェクト可能な限り最も一般的な意味での集合であってもよいジェネリックコレクションからストリームを取得するにはどうすればよいですか?

public void f(Object o) { 
    if (o instanceof SOMECLASSORINTERFACE<?>) { 
     Stream.of(o).map(..)...; 
    } else { 
     // o is scalar 
     ... 
    } 
} 

上記のコードは機能しません。Stream.of()は、自分のオブジェクトをその要素に分割してストリームしませんが、1つの要素(オブジェクトo)のみを出力します。

oがあまりにも一般的で、streamメソッドがないため、o.stream().map...は使用できません。

キャストo~Collectionは機能しません。はまた、Collection会員をチェックすると、おそらく行うにはない正しいことである...

それでは、どのように私はジェネリックコレクションのうち、ストリームを取得できますか?

+2

オブジェクトは、それが一般的なすべてのもので、一般的なコレクションではありません、あなたはキャストを行うか、例えば使用する必要がありますObjectではなくIterableです。 –

答えて

1

私は現在持っているソリューションは、IterableConvert Iterable to Stream using Java 8 JDKを参照)、Map会員の両方をテストすることです:

public void f(Object o) { 
    if (o instanceof Iterable<?>) { 
     StreamSupport.stream(((Iterable<?>) o).spliterator(), false).map(e -> ... 
    } else if (o instanceof Map<?,?>) { 
     ((Map<?,?>) o).entrySet().stream().map(e -> ... 
    } else { 
     // scalar object 
     ... 
    } 
} 
1

あなたObjectCollection<?>であり、あなたはそれをキャスト、Collection<?>のようにそれを扱いたい場合。

public void f(Object o) { 
    if (o instanceof Collection<?>) { 
     Collection<?> c = (Collection<?>)o; 
     c.stream().map(...).forEach(System.out::println); 
    } else { 
     System.out.println(o); 
    } 
} 
+0

私の 'Object'は' Object'です。 'Collection'かもしれません。 – sebnukem

+1

@sebnukemこれは 'if(o instanceof Collection ){...}が対象です。 'Collection 'の場合にのみキャストします。 – bradimus

+0

はい、可能なすべての種類のコレクション(マップなど)には該当しません。 'Map'は' Collection'ではありません。 – sebnukem

3

正しいことは確かObjectを取る機能を有していないだろうが、関数のoberloadingを使用すると、あなたはおそらく取ることができるかを考えるために:

  • Collection<T> - これは確かに.stream()を持っていますそして
  • Map<K,V>は次のようになりCollection<T>が、その.entrySet().keySet()などで覆われていないなどSet、などListなど、ほとんどのケースをカバーしています。
  • Iterable<T>は、すでに記載されているように、StreamSupport.stream(((Iterable<?>) o).spliterator(), false)と別々に扱わなければなりません。

したがって、上記の3例のための3つの機能を作成して、あなたはおそらく大丈夫:

public <T> void f(Stream<T> s) { 
    s.map(..) 
     .forEach(System.out::println); 
} 

public void f(Collection<?> o) { 
    f(o.stream()); 
} 

public void f(Map<?,?> m) { 
    f(m.entrySet().stream()); 
} 

public void f(Iterable<?> i) { 
    f(StreamSupport.stream(i.spliterator(), false)); 
} 

public void f(Object o) { 
    // for the cases none of the others match 
    System.out.println(o); 
} 
+0

はい、これは私が現在持っている解決策です。ありがとうございました。 – sebnukem

関連する問題