Trong lớp bên dưới, tôi chuyển tham chiếu phương thức WordCounterEx::accumulate
làm tham số thứ hai cho phương thức giảm. Chữ ký của phương thức giảm là:Tham chiếu phương thức không hoàn thành hợp đồng giao diện chức năng nhưng nó biên dịch. Làm thế nào nó có thể?
<U> U reduce(U identity,
BiFunction<U, ? super T, U> accumulator,
BinaryOperator<U> combiner);
Do đó, thông số thứ hai của phương pháp giảm, phải hoàn thành công thức BiFunction. Nhưng phương pháp tích lũy được truyền không phải là BiFunction (nó chỉ có một tham số). Tại sao nó vẫn biên dịch?
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*/);
}
}
Lưu ý rằng trong Java 8 bạn có thể vượt qua 'this' như một cuộc tranh cãi, khớp với chữ ký hoàn hảo: 'công khai WordCounterEx tích lũy (WordCounterEx này, Ký tự c)'. Điều này tương đương với phiên bản không có 'this' như một đối số, như trong câu hỏi. –