Comments 15
Я бы предложил пару вещей, которые можно сделать со статьей, чтобы она больше соответствовала формату:
- Оформлять блоки кода как блоки кода
- Пометить статью как "Tutorial", т.к. это базовые знания по Java и будут полезны начинающим
- Лично я бы убрал загадочные формулы с синусами и упоминание карринга, это совершенно нерелевантно
- Быть более снисходительным к документации, вещи вроде "И все бы хорошо, да худо только в том, что прийти к этому решению рациональным путем просто невозможно" не совсем отражают положение вещей. Мне кажется, любой, кто использует Java 8 больше чем пару дней знает про функциональные интерфейсы и они описаны в ссылке на документацию, которая приводится в статье — Function прямо говорит, что это Functional interface.
1. Вы можете проверить это в HTML страницы- кодовые блоки оформлены в соответствии с возможностями сайта с помощью HTML-блоков code. Но я согласен, код выглядит плохо. Я заметил, некоторые авторы помещают цветные скриншоты. Согласен, оформлять код надо получше, с цветами элементов и т.д.
2. Tutorial для меня нечто большее.
3. Пассаж с каррингом очевидно на Вас не подействовал. Суть вопроса в том, как нормальный Java программист, не знающий про магию функции apply будет определять функцию с тремя аргументами. Наверное он вспомнит что есть карринг. Шутка не удалась.
4. Про снисходительность совершенно с Вами не согласен. Речь идет о том, что функция apply не-до-документирована. Её важнейшее свойство не описано вообще. Однако — спасибо за Ваше замечание. Я подправил текст и усилил именно этот аспект.
Видимо этим объясняется и предложение N1 из певого комментаоия.
Видимо постпроцессор за этот час поработал и сделал код симпатичнее.
Как следствие этой замены, дискуссия о форматирования кода и предложение из первого комментария становятся неактуальными.
Функция apply
тут не при чем, метод может называться как угодно. Любой интерфейс с единственным методов (SAM, single abstract method) может быть функциональным интерфейсом. И документация про это говорит: "Each functional interface has a single abstract method, called the functional method for that functional interface, to which the lambda expression's parameter and return types are matched or adapted".
Не оставляю надежды, что некоторым читателям статья показалась полезной в их практической деятельности.
Есть у меня несколько замечаний.
Наверняка вы слышали о карринге — методе преобразования функции с N параметрами в функции с N + 1 параметрами
Кажется вы не понимаете, что такое "карринг". В Java он выглядел бы, например, как представление объекта BiFunction<X, Y, R>
в виде Function<X, Function<Y, R>>
. Такой финт позволяет реализовать любую арность только через интерфейс Function
.
Ну а ваш пример с f2(f1(x), y)
неверен. Да и дальше по тексту карринг нигде не упоминается.
прийти к этому решению рациональным путем просто невозможно
Не соглашусь. Выражать функции 3-х аргументов с помощью методов с 3-мя параметрами это наиболее рациональная и очевидная вещь, какую только можно сделать. Документация подобные факты упоминать не будет по тем же причинам — это и так должно быть очевидно.
трехарных
Тернарных.
Про очеаидность не соглашусь. Попробуйте сделать в Stackoverflow запрос «Trifunction java» и посмотрите заодно какие там даются экспертами советы.
«Трех-арных» было употреблено как бы в созвучие слову из заголовка «мультиарные». Но текст я подправил. Спасибо.
Большой разницы между вашим примером для BiFunction… и моим для f2 я не вижу
Возможно я выразился немного запутано, позвольте объяснить подробнее.
Функция f2
в вашем примере является двуместной, об этом говорит запятая в списке её аргументов. Будь она каррированной, у неё был бы всего один параметр.
Более формально — пусть у вас есть функция f : (A x B) -> R
(где A x B
— декартово произведение).
Каррированная её версия являлась бы отображением g : A -> (B -> R)
, то есть функцией одного аргумента, результатом работы которой тоже является функция одного аргумента. Такого вида функции как раз часто встречаются в функциональных языках.
Чтобы Ваш комментарий остался понятен и последующим читателям, я тем не менее не буду в этом месте изменять текст статьи.
Но это самостоятельный вопрос, ответ на который разработчики Java дали в верси 8 введением функций в состав языка.
А моя статья рассказывает о специальной разновидности функций.
Кстати, метод использования Tuple для многих выходных параметров актуален и для обьектов.
Мульти-арные функции в Java