नीचे दी गई कक्षा में, मैं विधि संदर्भ WordCounterEx::accumulate
को कम करने के तरीके के दूसरे पैरामीटर के रूप में पास करता हूं। विधि को कम के हस्ताक्षर है:विधि संदर्भ कार्यात्मक इंटरफ़ेस अनुबंध को पूरा नहीं करता है लेकिन यह संकलित करता है। यह कैसे संभव है?
<U> U reduce(U identity,
BiFunction<U, ? super T, U> accumulator,
BinaryOperator<U> combiner);
इस प्रकार विधि को कम करने, BiFunction नुस्खा पूरा करना चाहिए के दूसरे पैरामीटर। लेकिन पारित संचय विधि बीआईएफक्शन नहीं है (इसमें केवल एक पैरामीटर है)। यह अभी भी संकलित क्यों है?
public class WordCounterEx {
private final int counter;
private final boolean lastSpace;
public WordCounterEx(int counter, boolean lastSpace) {
this.counter = counter;
this.lastSpace = lastSpace;
}
public int countWords(Stream<Character> stream) {
WordCounterEx wordCounter = stream.reduce(new WordCounterEx(0, true),
//HOW CAN THIS WORK? here must come BiFunction - R apply(T t, U u);
WordCounterEx::accumulate,
WordCounterEx::combine);
return wordCounter.counter;
}
public WordCounterEx accumulate(Character c) {
if(Character.isWhitespace(c)) {
return lastSpace ?
this :
new WordCounterEx(counter, true);
} else {
return lastSpace ?
new WordCounterEx(counter+1, false) :
this;
}
}
public WordCounterEx combine(WordCounterEx wordCounter) {
return new WordCounterEx(counter + wordCounter.counter
,wordCounter.lastSpace /*does not matter*/);
}
}
नोट जावा 8 में आप एक तर्क के रूप 'गुजारें सकता है कि this', जो हस्ताक्षर से पूरी तरह मेल खाता है: 'सार्वजनिक वर्डकॉन्टरएक्स जमा (वर्डकॉन्टरएक्स यह, कैरेक्टर सी) '। यह प्रश्न में जैसे तर्क के रूप में 'this' के बिना संस्करण के बराबर है। –