powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Функциональные фичи java 8
23 сообщений из 23, страница 1 из 1
Функциональные фичи java 8
    #39368024
Kripke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В java 8 одно и то же можно написать в "классическом" стиле, например,
Код: java
1.
2.
3.
4.
5.
6.
7.
String name;
if (obj instanceof Person) {
	final Person person = (Person) obj;
	name = person.getName();
} else {
	name = obj.toString();
}


а можно в "функциональном" стиле
Код: java
1.
2.
3.
4.
5.
String name = Optional.of(obj)
                .filter(Person.class::isInstance)
                .map(Person.class::cast)
                .map(Person -> person.getName())
                .orElse(obj.toString());


Как пишете вы? Какой вариант вам нравится больше и почему?
...
Рейтинг: 0 / 0
Функциональные фичи java 8
    #39368038
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример не показательный. За такой код надо отрывать лишнее и пришивать на место.
При нормальном форматировании и именовании 1й блок будет читаться даже лучше.

Пишу на лямдах много. Стримы медленнее чем циклы. Их не удобно дебажить. Зато очень многое можно сократить до безобразия. Те же multi map теперь просто Collectors.groupBy - очень круто.

Важно помнить что в нагруженых местах есть смысл отказаться от лямбд и стримов.

Для меня интересным вопросом на днях стало такой пример

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
for(Element e : list){
    if(e.meetsCondition()){
           process(e);
    }
}

list.stream()
   .filter(Element::meetsCondition)
   .forEach(this::process);



Есть ли смысл? Стрим, очевидно, медленнее. И вряд ли читается лучше.
...
Рейтинг: 0 / 0
Функциональные фичи java 8
    #39368050
Kripke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz, топик возник из ковыряния в коде проекта. Есть много мест, где прилетает Object и приходится кастить к своему типу. Ну API такое... И вижу два таких подхода. Сам, признаться, ближе к первому, мне лично более читабельно. Но не хочется прослыть ретроградом :)
...
Рейтинг: 0 / 0
Функциональные фичи java 8
    #39368053
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kripke,

Вам прилетают объекты неизвестного типа? И вы вынуждены вручную разбирать их перед каждым кастингом? Просто если объектов много, достаточно одного фасада, чтобы их все прикастить и не писать такую галиматью.
...
Рейтинг: 0 / 0
Функциональные фичи java 8
    #39368056
Kripke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz, например, JFace ITreeContentProvider. Все Object. Пример выше - примерно из той же оперы.
...
Рейтинг: 0 / 0
Функциональные фичи java 8
    #39368061
Kripke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну то есть на самом деле типов объектов не много, но я вынужден везде кастить к типу, т.к. прилетают Object отовсюду.
...
Рейтинг: 0 / 0
Функциональные фичи java 8
    #39368062
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kripke,

Пфф. Для этого пишется своя собсвенная строго типизированная модель. А эти гуевые приблудины лишь оборачивают ее чтобы показывать на гуе. И бизнес-логика пишется на модели, а не на объектах, которые вы решили вдруг вытащить из нее через АПИ гуя.

Я все еще уверен что тут ошибка проектирования, а не безвыходная ситуация.
...
Рейтинг: 0 / 0
Функциональные фичи java 8
    #39368065
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KripkeНу то есть на самом деле типов объектов не много, но я вынужден везде кастить к типу, т.к. прилетают Object отовсюду.

Давайте что ли код посмотрим? Объекты эти вы же сами туда помещаете? Покажите примеры с другим объектами? ПОтому как ваш метод, например можно переписать как

BeanUtils.getPropertyWithMethodFallback(Person.class, Person::getName, Object::toString)
Метод у вас, кстати, NPE выкинет. String.valueOf() можно использовать.
...
Рейтинг: 0 / 0
Функциональные фичи java 8
    #39368081
Kripke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Там не выкинет NPE. null не передается. Тогда уж Stream.of эксепшн кинет
Вообще это немного адаптированный кусок туториала ) но код можно и посмотреть, когда за компом окажусь
Пока же моя мысль в том, что там где мне нужно заимплементить некий интерфейс, где везде используется Object в качестве параметров ( а в jface это везде) каста мне не избежать, неважно где.
Да вообще мысль не о касте была ) а о том, что стоит ли пихать лямбды, стримы и опшнл везде где позволяет фантазия, или нет. Ваш пример, кстати, тоже отличный.
Про конкретно свой напишу через пару часов
...
Рейтинг: 0 / 0
Функциональные фичи java 8
    #39368097
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KripkeПока же моя мысль в том, что там где мне нужно заимплементить некий интерфейс, где везде используется Object в качестве

Да, куча разных решений может быть. На лямдах вообще можно много чего вкусного делать и помимо функциональных паравозиков. Надо конкретику смотреть.

Kripkeпараметров ( а в jface это везде) каста мне не избежать, неважно где.

Я JFace не помню. Но Swing тоже про генерики не знает. И там все просто. Если у вас код для ГУИ, то в нем не должно быть
if(obj instanceof Person) в принципе.
Если у вас код - бизнес логика, то он должен оперировать уже строгими типами, а не Object, которые вы протянули из гуя.
Прежде чем я закомичу в репозиторий код if(obj instanceof ...) я 10 раз подумаю, что же это я за лох такой, что не могу полиморфизм применить.

KripkeДа вообще мысль не о касте была ) а о том, что стоит ли пихать лямбды, стримы и опшнл везде где позволяет фантазия, или нет. Ваш пример, кстати, тоже отличный.

Нет, не стоит везде пихать. Стримоблямбды нужны только там где они значительно сокращают код, либо делают его легко читаемым другим способом. В противном случае мы получаем более медленный и хуже читаемый код. И какой тогда профит? Просто потому что можно?

KripkeПро конкретно свой напишу через пару часов
Не факт что смогу сегодня или завтра ответить. Но было бы интересно.


Кстати, в Java 8 очень херовый опшнл. Там куча косяков. Например, я постоянно сталкиваюсь с тем что нельзя тупо вызвать метод, если значение null. Вроде, в 9 должны полезных исправлений добавить.
...
Рейтинг: 0 / 0
Функциональные фичи java 8
    #39368195
Kripke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сначала про java 8
BlazkowiczНа лямдах вообще можно много чего вкусного делать и помимо функциональных паравозиков.
Да, согласен, к тому что я пытался спросить этим топиком, лямбда имеет не самое прямое отношение. Я имел в виду именно функциональные паровозики )

BlazkowiczКстати, в Java 8 очень херовый опшнл. Там куча косяков. Например, я постоянно сталкиваюсь с тем что нельзя тупо вызвать метод, если значение null.
Не совсем понял, что именно вы имеете в виду под нельзя тупо вызвать метод?

BlazkowiczСтримы медленнее чем циклы. Их не удобно дебажить. Зато очень многое можно сократить до безобразия.
С дебагом согласен. Про то что медленнее - не знал.
...
Рейтинг: 0 / 0
Функциональные фичи java 8
    #39368205
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kripke,
Лямбда и реактивное программирование круто. Паровозики фигня.
...
Рейтинг: 0 / 0
Функциональные фичи java 8
    #39368212
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kripke, данный юзкейс - скорее антипаттерн. Если брать два варианта в code-review
то я пропущу первый вариант а второй верну в доработку.

Есть базовый функционал языка который прост и атомарен. Это ключевые слова
таке как if-else-instanceof. И он работает и по нему ходит
отладчик. И для него есть жесткая оценка complexity. Я ее могу глазами посчитать.

Во втором варианте - мы видим нечто, гипертрофированние. И использовать его в продуктиве
это все равно что заниматься пере-проектированием. Или как в математике расчету
простых задач с вовлечением мат-аппарата двойных и тройных интегралов там где
достаточно посчитать площать или объем уже по известным формулам геометрии.

Поэтому после того как эйфория от новаторства пройдет и мы начнём "огребать" по полной
за такие новаторства (надо хотя-бы посмотреть как раздувается байткод и померять
потери на JIT) я ожидаю что господин Шипилёв разразится очередным видекастом на тему
печальных последствий от функционального подхода везде где нужно и где не нужно.

Я-бы с очень большой надеждой ожидал введения в language новых оп-кодов для
расширенных наборов команд процессоров (длинная арифметика и векторизация).

А творческие эксперименты в области искусственного интеллекта и решения фундаметальных
задачек-проблем (типа расстановка 8 ферзей или решение коммивояжера) предоставил
бы решать на Scala.

Благо она для этого приспособлена больше чем Java.
...
Рейтинг: 0 / 0
Функциональные фичи java 8
    #39368214
Kripke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Теперь по касты
BlazkowiczЕсли у вас код для ГУИ, то в нем не должно быть if(obj instanceof Person) в принципе.
Если у вас код - бизнес логика, то он должен оперировать уже строгими типами, а не Object, которые вы протянули из гуя.
Прежде чем я закомичу в репозиторий код if(obj instanceof ...) я 10 раз подумаю, что же это я за лох такой, что не могу полиморфизм применить.

Согласен. Собственно сама бизнес логика и оперирует строгими типами. Но вот место стыка бизнес логики и API JFace содержит немало if instanceof. Оговорюсь, в JFace не эксперт, столкнулся совсем недавно. Подглядываю в туториалы и существующий код. Везде касты. Буду рад, если узнаю как это сделать более правильно. Ибо мысль про лоха таки посещает )
Теперь к примеру. Т.к. я уже упомянул дерево, то вот туториал дерева в JFace . Т.е. нужно заимплементить несколько различных Provider-ов. Правда, instanceof там не так много, зато хватает просто смелых кастов. И вот в таких местах, как LabelProvider.getText(), getImage() появляются те самые куски кода, с которых я начал тему
...
Рейтинг: 0 / 0
Функциональные фичи java 8
    #39368226
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kripke,
Я лично не против кастинга. Тем более в нижнем слое. Вы же компонент приводите.
Интересен пример в БЛ. Но вы вроде намного ниже пишите.
...
Рейтинг: 0 / 0
Функциональные фичи java 8
    #39368502
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123пишитеэто приказ
...
Рейтинг: 0 / 0
Функциональные фичи java 8
    #39368534
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OFF
grasoff.net,
если юмор, то смайлик ставь.
А так, попусту, нечего злопыхать и оффтопить из за угла.
...
Рейтинг: 0 / 0
Функциональные фичи java 8
    #39369416
Фотография FishHook
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123если юмор
Это не юмор, это вам намекают, что вы не знаете правил русского языка за пятый класс, креативный вы программист.
...
Рейтинг: 0 / 0
Функциональные фичи java 8
    #39369427
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FishHook,
Адвокат. Я ему намекнул, чтобы не намекал.
Вы этот намёк видно не поняли.
...
Рейтинг: 0 / 0
Функциональные фичи java 8
    #39369848
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KripkeТеперь к примеру. Т.к. я уже упомянул дерево, то вот туториал дерева в JFace . Т.е. нужно заимплементить несколько различных Provider-ов. Правда, instanceof там не так много, зато хватает просто смелых кастов. И вот в таких местах, как LabelProvider.getText(), getImage() появляются те самые куски кода, с которых я начал тему

Если бы у меня было 2 или более типов в дереве, то я бы создал свой класс или интерфейс GenericBlablablaProvider<T>.
Под каждый конкретный тип - реализацию этого класса.
А реализацию для JFace сделал бы в виде прокси, которая бы по типу аргумента через Map<Class, Provider> делегировал бы вызов конкретной реализации для типа.

Вам нужно научится разделять логику.
Вот этот код, общий для кучи классов.

Код: java
1.
2.
3.
4.
5.
6.
if (obj instanceof SpecificClass) {
	final SpecificClass person = (SpecificClass) obj;
        ...
} else {
	result = fallbackDataProvider.call();
}



А Person.getName() - конкретный для конкретного типа.
Поэтому если общий код встречается часто, то его нужно выносить. Благо сейчас с лямбдами такие вещи делать легко и приятно.
...
Рейтинг: 0 / 0
Функциональные фичи java 8
    #39375438
Kripke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как написать на стримах аналог full outer join?
...
Рейтинг: 0 / 0
Функциональные фичи java 8
    #39375454
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KripkeА как написать на стримах аналог full outer join?
Common SQL Clauses and Their Equivalents in Java 8 Streams
...
Рейтинг: 0 / 0
Функциональные фичи java 8
    #39403807
Brynn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очень похожий вопрос. В groovy есть оператор ?., и можно написать что-то типа a?.b?.c?.d. В java с приходом Optional стало можно написать что-то типа
Код: java
1.
Optional.ofNullable(a).map(A::getB).map(B::getC).map(C::getD).map(D::getValue).orElse(null)


Что для вас более читабельно/предпочтительно, такая цепочка из map или матрешка из if?
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Функциональные фичи java 8
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]