Ich versuche, das die folgende Methode Referenzcode verstehen mit Lambda-Ausdrücke in Java:Java Lambda Ausdruck Parameter
interface MyFunc<T> {
boolean func(T v1, T v2);
}
class HighTemp {
private int hTemp;
HighTemp(int ht) {
hTemp = ht;
}
boolean sameTemp(HighTemp ht2) {
return hTemp == ht2.hTemp;
}
boolean lessThanTemp(HighTemp ht2) {
return hTemp < ht2.hTemp;
}
}
class InstanceMethWithObjectRefDemo {
static <T> int counter(T[] vals, MyFunc<T> f, T v) {
int count = 0;
for (int i = 0; i < vals.length; i++) {
if (f.func(vals[i], v)) {
count++;
}
}
return count;
}
public static void main(String args[]) {
int count;
HighTemp[] weekDayHighs = {new HighTemp(89), new HighTemp(82),
new HighTemp(90), new HighTemp(89),
new HighTemp(89), new HighTemp(91),
new HighTemp(84), new HighTemp(83)};
count = counter(weekDayHighs, HighTemp::sameTemp,
new HighTemp(89));
System.out.println(count + " days had a high of 89");
HighTemp[] weekDayHighs2 = {new HighTemp(32), new HighTemp(12),
new HighTemp(24), new HighTemp(19),
new HighTemp(18), new HighTemp(12),
new HighTemp(-1), new HighTemp(13)};
count = counter(weekDayHighs2, HighTemp::sameTemp,
new HighTemp(12));
System.out.println(count + " days had a high of 12");
count = counter(weekDayHighs, HighTemp::lessThanTemp,
new HighTemp(89));
System.out.println(count + " days had a high less than 89");
count = counter(weekDayHighs2, HighTemp::lessThanTemp,
new HighTemp(19));
System.out.println(count + " days had a high of less than 19");
}
}
Meine Frage ist, warum Funktion sameTemp nur einen Parameter hat? Die Schnittstelle deklariert, dass sie 2 Parameter haben muss, also ergibt das für mich keinen Sinn. Vielleicht reicht die hTemp-Instanzvariable für beide aus? Ich habe dies aus Java die komplette Nachschlagewerk und gibt der Autor erklärt dies:
Blockquote
Im Programm feststellen, dass HighTemp zwei Instanzmethoden hat:
sameTemp( )
undlessThanTemp( )
. Die erste gibt true zurück, wenn zwei HighTemp-Objekte die gleiche Temperatur enthalten. Die zweite gibt true zurück, wenn die Temperatur des aufrufenden Objekts kleiner als die des übergebenen Objekts ist. Jede Methode hat einen Parameter vom Typ HighTemp und jedes Metoreturn ein boolesches Ergebnis. Daher ist jedes mit der MyFunc-Funktionsschnittstelle kompatibel, weil der aufrufende Objekttyp dem ersten Parameter vonfunc( )
und dem -Argument zugeordnet werden kann, das dem zweiten Parameterfunc( )
zugeordnet ist.
Vielen Dank!
Siehe auch http://stackoverflow.com/questions/32855138/how-does-a-method-reference-to-an-instance-method-of-an-ibitrary- object-of-ap und http://stackoverflow.com/questions/23139725/using-method-reference-instead-of-multi-argument-lambda und http: // stackoverflow.com/questions/22516331/whats-the-difference-zwischen-instance-method-reference-types-in-java-8 (und http://stackoverflow.com/questions/37037015/why-stringbuilderappend-is-biconsumerstringbuilder-string) – Tunaki