関数を関数に渡す
perlのmapみたいなやつをやってみる。(ちなみにFirefox搭載のJavaScript1.6にはmap関数あるそうな。)
<script language = "JavaScript"> function hoge(x) { return x + 1; } function fMap(arr, func) { var ret = new Array(); var i; for(i = 0; i<arr.length; i++) { ret[i] = func(arr[i]); } return ret; } var arr1 = [1, 2, 3]; var moge = fMap(arr1, hoge); alert(moge.join(", ")); </script>
配列の各要素に対して、ある関数を通して結果を配列として返すと。
同じようなことをJavaでもやってみる。
import java.lang.reflect.*; public class hoge { private static int hoge(int x) { return x + 1; } private static int[] fMap(int[] arr, Method func) throws Exception { int[] ret = new int[arr.length]; for(int i=0; i<ret.length; i++) { ret[i] = ((Integer)func.invoke(null, new Object[]{new Integer(arr[i])})).intValue(); } return ret; } public static void main(String[] args) throws Exception { int[] arr1 = {1, 2, 3}; int[] moge = fMap(arr1, hoge.class.getDeclaredMethod("hoge", new Class[]{Integer.TYPE})); for(int i=0; i<moge.length; i++) { System.out.print(moge[i] + ", "); } } }
Java5の文法で書けばもう少しすっきりしそうですが、検査例外も捕捉しないといけないし、ちょっと面倒。
Java版は、最後に余計なカンマが出力されるのはご愛嬌(汗
JavaScriptの言語としての進化をいまさらながら感じます。