Ответ 1
Как вы отметили, семантика лямбда x -> x != null
и ссылка метода Objects::nonNull
практически идентичны. Мне трудно придумать какую-либо реальную наблюдаемую разницу, не врываясь в класс, используя отражение, или что-то в этом роде.
Преимущество использования небольшого пространства для использования ссылки на метод лямбда. С помощью лямбда код лямбда скомпилирован в частный статический метод содержащего класса, а затем лямбда-метафайлу вызывается со ссылкой на этот статический метод. В ссылочном примере метода этот метод уже существует в классе java.util.Objects
, поэтому лямбда-метафайлер является вызовом со ссылкой на существующий метод. Это приводит к умеренной экономии пространства.
Рассмотрим эти маленькие классы:
class LM { // lambda
static Predicate<Object> a = x -> x != null;
}
class MR { // method reference
static Predicate<Object> a = Objects::nonNull;
}
(Заинтересованные читатели должны запустить javap -private -cp classes -c -v <class>
, чтобы просмотреть подробные различия между тем, как они скомпилированы.)
В результате получается 1 094 байта для случая лямбда и 989 байтов для случая ссылки метода. (Javac 1.8.0_11.) Это не огромная разница, но если ваши программы, вероятно, будут иметь большое количество лямбда, как это, вы можете подумать о экономии пространства в результате использования ссылок на методы.
Кроме того, более вероятно, что ссылка на метод может быть JIT-скомпилирована и встроена, чем лямбда, так как ссылка на метод, вероятно, используется намного больше. Это может привести к небольшому улучшению производительности. Кажется маловероятным, что это будет иметь практическое значение, однако.
Хотя вы специально сказали "За исключением стиля кода...", это в основном касается стиля. Эти небольшие методы были специально добавлены в API, так что программисты могли использовать имена вместо встроенных lambdas. Это часто улучшает понятность кода. Другим моментом является то, что ссылка на метод часто содержит явную информацию о типе, которая может помочь в случаях сложного типа вывода, таких как вложенные компараторы. (Однако это не относится к Objects::nonNull
.) Добавление добавленных или явно введенных параметров лямбда добавляет много беспорядка, поэтому в этих случаях ссылки на методы являются явным выигрышем.