簡単に言えば、制限は物事をまとめる正しい方法が少ないことを意味し、一流の関数はループ構造のようなものを簡単に除外することを可能にします。この答えからループを取ります、例えば:
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
String string = iterator.next();
if (string.isEmpty()) {
iterator.remove();
}
}
これは、たまたまコレクションを繰り返し処理している間にコレクションから要素を削除するためのJavaでの安全な必須の方法の1つです。非常によく似ているが間違っている方法がたくさんあります。この方法を知らない人は、代わりにコピーを繰り返すなど、複雑な方法で問題を回避することがあります。
このジェネリックを作成するのはそれほど難しくないのでStrings
、のコレクション以上で機能しますが、ファーストクラスの関数がなければ、述語(内の条件if
)を置き換えることができないため、このコードはコピーして貼り付けられる傾向がありますわずかに修正されました。
あなたを与えるファーストクラスの機能を組み合わせる能力あなたがいない場合、それは非常に迷惑になり不変性の制約で、パラメータとして述語を渡すことを、あなたはのような単純なビルディング・ブロックを思い付くfilter
このScalaのコードのように、それは同じことをします:
list filter (!_.isEmpty)
次に、Scalaの場合、コンパイル時に型システムが何をチェックするかを考えますが、これらのチェックは、最初に実行したときに動的型システムによっても行われます。
list
filter
メソッドをサポートする何らかの種類、つまりコレクションである必要があります。
- の要素には、ブール値を返すメソッドが
list
必要isEmpty
です。
- 出力は、同じタイプの要素を持つ(潜在的に)より小さなコレクションになります。
これらのことを確認したら、プログラマーが台無しにする他の方法は何ですか?を誤って忘れて!
しまい、非常に明白なテストケースエラーが発生しました。それが犯すことのできる唯一の間違いであり、逆条件をテストしたコードから直接翻訳していたので、私はそれを犯しました。
このパターンは何度も繰り返されます。ファーストクラスの関数を使用すると、正確なセマンティクスを備えた小さな再利用可能なユーティリティに物事をリファクタリングできます。不変性などの制限により、そうするための推進力が得られます。
もちろん、これはすべて、プログラマーが単純化機能がfilter
すでに存在することを知り、それを見つけることができるか、自分で作成することの利点を認識することに依存しています。テール再帰のみを使用して、これをどこでも自分で実装してみてください。そうすれば、命令型バージョンと同じ複雑さのボートに戻ってしまいます。非常に簡単に記述できるからといって、単純なバージョンが明白であることを意味しません。