ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

関数を関数に渡す

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の言語としての進化をいまさらながら感じます。