आपको एक इंटरफ़ेस बनाने की ज़रूरत है जो फ़ंक्शन (ओं) को प्रदान करता है जिसे आप चारों ओर से गुजरना चाहते हैं। उदाहरण के लिए:
/**
* 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;
}
});
अंत में, फंक्शन 1 में दिया गया नक्शा फ़ंक्शन निम्नानुसार उपयोग करता है:
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;
}
यदि आप मापदंडों में पारित करने की आवश्यकता नहीं है, या आप पैरामाउंट को कम "निश्चित" बनाने के लिए कई अन्य तकनीकों का उपयोग कर सकते हैं, तो आप अपने स्वयं के इंटरफ़ेस के बजाय रननेबल का उपयोग कर सकते हैं, लेकिन यह आमतौर पर प्रकार की सुरक्षा के साथ व्यापार-बंद है। (या आप अपने फ़ंक्शन ऑब्जेक्ट के लिए कंस्ट्रक्टर को ओवरएम्स में पास करने के लिए उस तरह से ओवरराइड कर सकते हैं .. बहुत सारे दृष्टिकोण हैं, और कुछ निश्चित परिस्थितियों में बेहतर काम करते हैं।)