パラメータcollect
なしでメソッドをどのように記述しますか? Closures
現在よりもはるかに複雑になります。ビルダー、inject
、each
、with
その他にも同じことが言えます...
これにより、一般的なものを定義し、後でより具体的にすることができます。たとえば、collect
メソッドは「コレクションまたはイテラブルを取得し、各要素に対して何かを実行し、新しく作成されたコレクションに追加する」と記述できます。後日、このDO SOMETHINGを指定する Closures がなければ、 の値はcollect
最小限になります。
ゆっくりと、より機能的な考え方に到達します。特定のタスクを実行する特定の関数を作成するのではなく、複数の問題に適用可能な一般的なアプローチを採用する関数を作成し、個々のケースの詳細をクロージャーに入れることはできますか?
編集
例として、 との倍数であるmin
との間の数値のリストを返すこの手続き型メソッドを考えてみましょう。max
mult
List<Integer> filter( int min, int max, int mult ) {
List<Integer> multiples = new ArrayList<Integer>() ;
for( int i = min ; i < max ; i++ ) {
if( i % mult == 0 ) {
multiples.add( i ) ;
}
}
multiples
}
println filter( 1, 200, 15 )
Closures (フィルタリング用) を使用して Groovy でこれを記述すると、次のようになります。
List<Integer> filter( int min, int max, int mult ) {
(min..max).findAll { it % mult == 0 }
}
println filter( 1, 200, 15 )
(この例は基本的に の機能をミラーリングしていることを認めます。そのfindAll
ため、おそらく良い例ではありません。また、多少不自然です)
ここで、他の基準 (整数がデータベースなどに存在すること) に基づいてフィルタリングすることを検討してください... まず、filter
メソッドを次のように書き直すことができます。
List<Integer> filter( int min, int max, Closure<Boolean> filter ) {
(min..max).findAll filter
}
println filter( 1, 200 ) { it % 15 == 0 }
次に、ご覧のとおり、要素を保持する場合は true を返し、要素を削除する場合は false を返す任意のクロージャーをこのメソッドに渡すことができます。
命令型のスタイルでこれを行うには、(おそらく) 非常によく似たタスクを実行する複数のメソッドが必要になります...