Рассмотрим следующий класс:
import java.util.Objects;
import java.util.function.Predicate;
public class LambdaVsMethodRef {
public static void main(String[] args) {
Predicate<Object> a = Objects::nonNull;
Predicate<Object> b = x -> x != null;
}
}
Первый предикат создается из справочника метода, а другой - лямбда-выражения. Эти предикаты имеют одинаковое поведение (тело nonNull
просто return obj != null;
). Лямбда на два символа короче (возможно, позволяет поточному конвейеру соответствовать одной строке).
Помимо стиля кода, существует ли разница между Objects::nonNull
и x -> x != null
? Положите другой путь, должен ли я отдать предпочтение другому?
В сообщениях списка рассылки lambda-dev и lambda-libs-spec- {наблюдатели, эксперты}, в которых упоминаются isNull
, nonNull
и isNotNull
(раннее название), не рассматривались. (Я удивлен, что никто не задавался вопросом о добавлении методов Objects, поскольку они тривиально заменяются лямбдой, но, с другой стороны, так это Integer::sum
.)
Я также посмотрел на байт-код с javap
. Единственное различие заключалось в том, что дескриптор метода был передан методу лямбда-метафайла bootstrap:
BootstrapMethods:
0: #16 invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
Method arguments:
#17 (Ljava/lang/Object;)Z
#18 invokestatic java/util/Objects.nonNull:(Ljava/lang/Object;)Z
#17 (Ljava/lang/Object;)Z
1: #16 invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
Method arguments:
#17 (Ljava/lang/Object;)Z
#20 invokestatic LambdaVsMethodRef.lambda$main$1:(Ljava/lang/Object;)Z
#17 (Ljava/lang/Object;)Z
Конечно, метафакультет мог бы делать разные вещи для ссылок на методы и лямбда, по прихоти JVM, так что это не очень много.