Java/Python 導入ガイド《10》引数に関数オブジェクトを
Java プログラマーのための Python 導入ガイド〈初級/入門編〉《Jython2.5.0》
《10》JPL の事例から
《著》森こねこ・本間りす・小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2003/05/23 ● 第2版♪2009/04/03
》作業中です《 2006年7月 7日 (金)
JPL の事例から
21.2 Iteration では、次の事例を紹介しています。
# 21.2 Iteration 571 public void removeLongStrings (Collection coll, int maxLen) { Iterator it = coll.iterator(); while (it.hasNext()) { String str = it.next(); if (str.length() > maxLen) it.remove(); } }
関数 removeLongStrings は、コレクション coll の中から、文字数 maxLen より長い文字列だけを削除します。これと同等のものは、関数 xfilter を使って、
>>> s = "The Java Collections Framework provides the following benefits:" >>> c = [e.strip(":") for e in s.split(" ")] >>> c ['The', 'Java', 'Collections', 'Framework', 'provides', 'the', 'following', 'benefits'] >>> xfilter(c, lambda e: len(e)>8) >>> c ['The', 'Java', 'provides', 'the', 'benefits']
すると、リスト c から、長さが 8 より大きい文字列だけを削除したのが分かります。
■ そこに選択の自由はありますか
Java 版の関数 filter/removeLongStrings に共通するのは、コレクションから任意の要素を削除することです。しかし、どの要素を削除するかが関数内に規定されているので、実行時にはそれを自由に選択できません。また、removeLongStrings では、その対象が文字列に限定されています。
Python 版の関数 xfilter では、どの要素を削除するかを、実行時に自由に選択できます。すると、用途を限定した関数を個別に用意する必要がなく、削除したい対象も特定の型には依存しません。そのため、仕様変更にも柔軟に対処できるだけではなく、動的スキーマを適用した問題解決にも有効な手段を提供できるようになります。
Last updated♪2009/08/04