こんな関数用のインターフェース用意してあげて、
public interface F<R, T> { R apply(T t); }
シーケンスクラスをこんな感じで作ってあげて、foreacch で関数インターフェース取るようにして、
public class Seq<E> { private List<E> list = new ArrayList<>(); public Seq(T... ts) { list.addAll(Arrays.asList(ts)); } public void print() { System.out.println(list); } public void foreach(F<E, E> f) { List<E> tmplist = new ArrayList<>(list.size()); for(E e : list) tmplist.add(f.apply(e)); list = tmplist; } } }
そぅすっと、こんな書き方ができます。
@Test public void test() { Seq<Integer> seq = new Seq<>(1, 2, 3); seq.foreach( new F<Integer, Integer>(){public Integer apply (Integer a) { return a * 2; } }); seq.print(); }
実行すると、
[2, 4, 6]
たしかに foreach で与えた関数が2倍されています。
こんな書き方ができるなんて知りませんでした。
なんて、答えはスクロールすると出てくるんですケド・・