คุณต้องสร้างส่วนต่อประสานที่มีฟังก์ชั่นที่คุณต้องการผ่าน เช่น:
/**
* A simple interface to wrap up a function of one argument.
*
* @author rcreswick
*
*/
public interface Function1<S, T> {
/**
* Evaluates this function on it's arguments.
*
* @param a The first argument.
* @return The result.
*/
public S eval(T a);
}
จากนั้นเมื่อคุณต้องการส่งผ่านฟังก์ชันคุณสามารถใช้ส่วนต่อประสานนั้นได้:
List<Integer> result = CollectionUtilities.map(list,
new Function1<Integer, Integer>() {
@Override
public Integer eval(Integer a) {
return a * a;
}
});
ในที่สุดฟังก์ชั่นแผนที่ใช้ผ่านใน Function1 ดังนี้:
public static <K,R,S,T> Map<K, R> zipWith(Function2<R,S,T> fn,
Map<K, S> m1, Map<K, T> m2, Map<K, R> results){
Set<K> keySet = new HashSet<K>();
keySet.addAll(m1.keySet());
keySet.addAll(m2.keySet());
results.clear();
for (K key : keySet) {
results.put(key, fn.eval(m1.get(key), m2.get(key)));
}
return results;
}
คุณสามารถใช้ Runnable แทนอินเทอร์เฟซของคุณเองได้หากคุณไม่ต้องการส่งผ่านพารามิเตอร์หรือคุณสามารถใช้เทคนิคอื่น ๆ เพื่อทำให้พารามิเตอร์นับน้อยลง "คงที่" แต่โดยทั่วไปแล้วจะเป็นการแลกเปลี่ยนกับความปลอดภัยของประเภท (หรือคุณสามารถแทนที่ Constructor เพื่อให้อ็อพเจ็กต์ฟังก์ชั่นของคุณส่งผ่าน params ในแบบที่ว่า .. มีวิธีการมากมายและทำงานได้ดีขึ้นในบางสถานการณ์)