• このエントリーをはてなブックマークに追加

スポンサードリンク

はじめに

Java 6 で 関数型言語のような map, filter を実装してみた.

結論としては, 結構めんどうだったのてやるべきではないということだった.

Environment

  • Java 6 (8 ではない)

実装方針

関数型言語の原則にそうように実装する.

  • クロージャは 無名クラスで実装
  • 高階関数は, クロージャとリストを引数にとって, 新しいリストを生成して返すように実装 (immutable).

実装

map

import java.util.List;
import java.util.ArrayList;

public class FunctionalMap {
	public static void main (String args[]) {
		List<Integer> xs = java.util.Arrays.asList (1,2,3,4,5);
		MyFunc<Integer> f = new MyFunc<Integer>() {
				public Integer evaluate (Integer x) { return x + 1; }
			};
		Functor<Integer> functor = new Functor<Integer>();
		
		List<Integer> ys = functor.map (f, xs);

		for (Integer y : ys){ System.out.print (y.toString () + " "); }
	}
}

class Functor<T> {
	public List<T> map (MyFunc<T> f, List<T> xs) {
		ArrayList<T> list = new ArrayList<T>();
		for (T x : xs) { list.add (f.evaluate (x)); }
		return list;
	}
}

interface MyFunc <T> {
	public T evaluate (T x);
}

results

2 3 4 5 6

filter

import java.util.List;
import java.util.ArrayList;

public class FunctionalMap {
	public static void main (String args[]) {
		List<Integer> xs = java.util.Arrays.asList (1,2,3,4,5);
		MyFilter<Integer> g = new MyFilter<Integer>() {
				public boolean evaluate (Integer x) { return x % 2 == 0; }
			};
		
		Functor<Integer> functor = new Functor<Integer>();
		
		List<Integer> zs = functor.filter (g, xs);		

		for (Integer z : zs){ System.out.print (z.toString () + " "); }		
	}
}

class Functor<T> {
	public List<T> filter (MyFilter<T> f, List<T> xs) {
		ArrayList<T> list = new ArrayList<T>();
		for (T x : xs) {
			if (f.evaluate (x))
				list.add (x);
		}
		return list;
	}
}

interface MyFilter <T> {
	public boolean evaluate (T x);
}

results

2 4