2017-04-22 3 views
-1

ストリームを作成せずにリストのanyMatch、anyMatchを呼び出すことはできません(パフォーマンス上の理由から)。そこで、私は次のようなユーティリティメソッドを作成し始めました。allMatch、ストリームを作成せずにリストのanyMatch

public static <T> boolean anyMatch(List<T> list, Predicate<T> predicate) { 
    for (T element : list) { 
     if (predicate.test(element)) { 
      return true; 
     } 
    } 
    return false; 
} 

もっと簡単な方法はありますか?

EDIT私は単一のオブジェクトのコストを心配するだけではありません。 Stream.anyMatchのソースを見ると、この単純なケースでは不要なことがたくさんあることがわかります。

+1

Java 8より前のいくつかのライブラリは、この種の問題を解決しました。 –

+0

'Stream'を使用しようとすると、どのようなパフォーマンスの問題が発生しますか? –

+0

@ JacobG。おそらく何も深刻ですが、それでも私は気になります。ストリームは明らかに、そのような単純なケースでは必要のない多くのことをします。 – lbalazscs

答えて

0

新しい方法が良い考えです。良いオブジェクト指向設計を維持するためにユーティリティメソッドの代わりにDecorator Patternを使用する方が良いでしょう。

public class StreamList<T> { 
List<T> list; 
public StreamList(List list) { 
    this.list = list; 
} 
public boolean anyMatch(Predicate<T> predicate) { 
    for (T element : list) { 
     if (predicate.test(element)) { 
      return true; 
     } 
    } 
    return false; 
} 
} 
+0

これには多くの構文エラーがあります。 –

+1

興味深いアイデア、+1!あなたは明らかにこの場合「静的」を取り除くことを意味しました – lbalazscs

+0

コンストラクタのパラメータは 'List '型でなければならず、何らかの理由で 'StreamList#anyMatch'のために再び' T'を定義しています。 –

関連する問題