Java 8: получить оператор-функцию-объект со ссылкой на метод

Мне было интересно, есть ли в Java 8 возможность получить ссылки на методы стандартных операторов (+, -, ‹, >, ...).

Я хочу получить это как Foo::+, где Foo - это определенное место, где я могу это получить. Поскольку Java не допускает использование специальных символов в именах методов, я не думаю, что это возможно, не так ли?

Если указанный выше способ не существует: есть ли место, где стандартные операторы определены как Foo::plus?

Я знаю, что есть возможность определить его как лямбда ((x, y) -> x + y), но, на мой взгляд, в некоторых случаях это могло бы быть более выразительно со ссылкой на метод на оператор, как это возможно в Haskell.


person F. Böller    schedule 17.07.2014    source источник


Ответы (3)


Я полагаю, что вы ищете int Integer.sum(int, int) и подобные методы, которые действительно предоставляются API.

В вашем списке отсутствуют многие методы, но JDK обычно не обеспечивает последний дюйм удобства, потому что его размер огромен даже без них.

Если вас это утешит, в каждом из моих проектов есть класс Util, куда я выбрасываю такие лакомые кусочки.

person Marko Topolnik    schedule 17.07.2014
comment
Такие операторы, как ›, ‹, тоже? Я не знаю, где искать. - person F. Böller; 17.07.2014
comment
Есть ли какое-то место, где, возможно, определены все операторы? Какой-то класс только со статическими методами, возможно, с именем Ops или что-то в этом роде? - person F. Böller; 17.07.2014
comment
Нет, я так не думаю. Это Integer.compare, но вам все равно придется написать код для получения логических предикатов. - person Marko Topolnik; 17.07.2014

Чистым способом был бы вспомогательный класс Operators, который содержит методы для всех операторов. Затем вы можете использовать эти методы в качестве ссылок. Конечно, стандартный библиотечный класс был бы лучше, чем собственный вспомогательный класс, но, по крайней мере, вы можете выбрать имя этого вспомогательного класса, так что вы можете выбрать имя, которое наиболее выразительно для вас.

person gexicide    schedule 17.07.2014

Стандартные операторы применяются только к примитивам и примитивам в штучной упаковке, и вы не можете динамически определить, какие операторы применимы к рассматриваемому объекту.

Изменить: если вы хотите знать, какой метод вы можете вызвать для выполнения стандартных функций оператора, вы можете выполнить проверку instanceof для сопоставимого интерфейса для операторов больше/меньше или равно (http://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html ).

person dammkewl    schedule 17.07.2014
comment
Стандартные операторы применяются только к примитивам и примитивам в штучной упаковке, и вы не можете динамически определить, какие операторы применимы к рассматриваемому объекту. Я этого не понимаю. Я думаю, компилятор может узнать, подходят ли типы. (Ну, может быть, мой английский слишком плох, чтобы его понять ;-)) - person F. Böller; 17.07.2014
comment
Хорошо, при реализации < я понимаю, что вы имеете в виду. Невозможно сделать < с суперклассом Number. - person F. Böller; 17.07.2014
comment
Единственный оператор, который работает с объектами, это ==. Это потому, что на самом деле он сравнивает не объекты, а только ссылку (указатель, если вы знакомы с С++). Итак, если 2 объекта имеют одинаковое содержимое, но они не являются одним и тем же экземпляром объекта, они все равно не вернут true в операторе ==. - person dammkewl; 17.07.2014