2017-02-02 8 views
1

フィルタ関数を記述している場合は、フィルタの外部変数に依存しています。例:Java 8のストリームAPIでは、どのように純粋なフィルタ関数を記述できますか?

public List<String> getMatches(String search) { 
    return stringList.stream().filter(str -> str.contains(search)).collect(Collectors.toList()); 
} 

このフィルタは外部パラメータによって異なります。私は、あなたがあらかじめ基準を知らないのであれば純粋な関数を使ってフィルタを書く方法を考えています。

+2

あなたが意味するものの例を挙げてください。 – Eugene

+0

"stringList.stream()。filter(search、(str、search) - > str.contains(search))。 ?もしあれば、私は自分自身のストリームlibraby AbacusUtilを開発しました。 "Stream.of(stringList).filter(search、(str、search) - > str.contains(search))。toList();" –

答えて

7

このラムダ:

str -> str.contains(search) 

純粋関数です。

機能は副作用を起こすと純粋ではありません。これはしません。


次に、機能が何かに依存しているかどうか、それが何を意味するのかという問題があります。

しかし、実際にはこの例では何が起こるか考えてみます。

  • searchオブジェクトがStringので、不変です。だから、Stringを突然変異させてフィルターを "破壊"することはできません。

  • ラムダがその値を取得した後にstream変数の値を変更できた場合、コンパイルエラーが発生します。

したがって、「依存性」は問題ありません。

searchstringBuilderだった、と何か他のものがそれを変異さ。またはラムダ自体が変異をした場合。しかし、それらが異なる例です。場合、それは有害であるかもしれない)

+1

おそらくOPはメソッド参照を作成しようとしていますが、APIを変更する必要があります。 +1 –

+0

あなたの答えをありがとう – srowley

2

関数はデータに依存しているという事実それだけではそれだけでは不都合ではありません。

searchは、変更不可能な文字列です。つまり、作成後に変更することはできないため、副作用の「ベクトル」であることを心配する必要はありません。

また、厳密に「純粋」なfilterのバージョンを作成することはできません。 filterは、そのフィルタリング機能が使用するデータが不変かどうかを知る方法がありません。

関連する問題