Ниже MyComparator
реализует Comparator
. Он принимает два аргумента.
Это то же самое, что и лямбда-выражение (d1,d2) -> d1.compareTo(d2)
, и то же самое, что и ссылка на метод Double::compareTo
Ссылка на метод такая же, потому что d1
является Double
, поэтому Java предполагает, что метод compareTo
должен быть вызван на первом Double
. Другой аргумент d2
становится аргументом для вызываемого метода. @ Andronicus также очень хорошо это объясняет.
3 варианта в этом примере эквивалентны:
import java.util.List;
import java.util.Comparator;
class MyComparator implements Comparator<Double> {
public int compare(Double d1, Double d2) { // (d1,d2) ->
return d1.compareTo(d2); // d1.compareTo(d2)
}
}
public class Testing {
public static void main(String[] args) {
List<Double> list = List.of(1.1,2.2,3.3,4.4,5.5,6.6,7.7);
Double maxClass =
list.stream()
.max(new MyComparator())
.orElse(Double.NEGATIVE_INFINITY);
Double maxLamdba =
list.stream()
.max((d1,d2) -> d1.compareTo(d2))
.orElse(Double.NEGATIVE_INFINITY);
Double maxMethodreference =
list.stream()
.max(Double::compareTo)
.orElse(Double.NEGATIVE_INFINITY);
}
}