Size: a a a

2020 March 02

VP

Vladimir Petrakovich in pro.jvm
Sergei
Вариант без if - stream().filter(...)
Можно ещё Optional.filter().ifPresent() 😏
источник

C

Cargeh in pro.jvm
Sergei
Вариант без if - stream().filter(...)
боюсь тебя огорчать, то там будет if(predicate.test(e)) execute()
источник

ДЧ

Денис Чиканов in pro.jvm
Sergei
Я о том же.
Я максимально язвителен в этом комментарии.
То, что ты if упаковал в три слоя функциональнщины, не делает его не-ифом.
источник

S

Sergei in pro.jvm
Cargeh
боюсь тебя огорчать, то там будет if(predicate.test(e)) execute()
В реализации с stream().filter() не будет if.
источник

ДЧ

Денис Чиканов in pro.jvm
Sergei
В реализации с stream().filter() не будет if.
Но ведь внутри у реализации всё ещё if. О чём тебе все говорят.
источник

AK

Alexander Komarov in pro.jvm
нет ни одной вещи, которую нельзя скрыть слоем абстракции.
источник

S

Sergei in pro.jvm
Денис Чиканов
Но ведь внутри у реализации всё ещё if. О чём тебе все говорят.
Конечно будет. Но есть некая разница между

if (target instanceof A) { ... }
if (target instanceof B) { ... }
if (target instanceof C) { ... }
if (target instanceof D) { ... }
if (target instanceof E) { ... }
if (target instanceof F) { ... }
if (target instanceof G) { ... }

и

classes
 .filter(pair -> pair.first.isInstance(object))
 .findFirst()
 .ifPresent(pair -> pair.second.apply(object));
источник

S

Sergei in pro.jvm
Alexander Komarov
нет ни одной вещи, которую нельзя скрыть слоем абстракции.
Кроме слишком большого количества абстракций.
источник

ДЧ

Денис Чиканов in pro.jvm
Sergei
Конечно будет. Но есть некая разница между

if (target instanceof A) { ... }
if (target instanceof B) { ... }
if (target instanceof C) { ... }
if (target instanceof D) { ... }
if (target instanceof E) { ... }
if (target instanceof F) { ... }
if (target instanceof G) { ... }

и

classes
 .filter(pair -> pair.first.isInstance(object))
 .findFirst()
 .ifPresent(pair -> pair.second.apply(object));
Ну если так писать, то конечно будет, но что мешает написать
for (Class clazz: classes) {
  if (target instanceof clazz)
  ...
}

кроме стримоза головного мозга?
источник

S

Sergei in pro.jvm
Денис Чиканов
Ну если так писать, то конечно будет, но что мешает написать
for (Class clazz: classes) {
  if (target instanceof clazz)
  ...
}

кроме стримоза головного мозга?
Ничего не мешает, можно и так написать. Будет даже "более быстрый код".

Стримы сильно упрощают чтение, и меньше вероятность накосячить.
источник

ДЧ

Денис Чиканов in pro.jvm
Sergei
Ничего не мешает, можно и так написать. Будет даже "более быстрый код".

Стримы сильно упрощают чтение, и меньше вероятность накосячить.
Я бы ещё поспорил, что из этого проще читать.
Когда ты хреначишь лишнюю абстракцию и слой обработки из ничего, чтобы по сути просто сматчить одну сущность из набора - это повышает когнитивную сложность.
источник

C

Cargeh in pro.jvm
Sergei
Конечно будет. Но есть некая разница между

if (target instanceof A) { ... }
if (target instanceof B) { ... }
if (target instanceof C) { ... }
if (target instanceof D) { ... }
if (target instanceof E) { ... }
if (target instanceof F) { ... }
if (target instanceof G) { ... }

и

classes
 .filter(pair -> pair.first.isInstance(object))
 .findFirst()
 .ifPresent(pair -> pair.second.apply(object));
в том, что для этого тебе придется где-то объявить связи и кода-то меньше не станет. Добавь ко второму варианту

Map<Class, Function> map = new HashMap<>();
map.put(A.class, (args) -> ...))
map.put(B.class, (args) -> ...))
map.put(C.class, (args) -> ...))
map.put(D.class, (args) -> ...))
map.put(E.class, (args) -> ...))
map.put(F.class, (args) -> ...))
map.put(G.class, (args) -> ...))

(ну или список из Pair<Class, Function>, без разницы)

И это хорошо если у тебя аргументы совпадат, иначе сделаешь годобджект Context в котором будет куча мусора. Нафига такое плодить?
источник

C

Cargeh in pro.jvm
Денис Чиканов
Я бы ещё поспорил, что из этого проще читать.
Когда ты хреначишь лишнюю абстракцию и слой обработки из ничего, чтобы по сути просто сматчить одну сущность из набора - это повышает когнитивную сложность.
+
источник

S

Sergei in pro.jvm
Cargeh
в том, что для этого тебе придется где-то объявить связи и кода-то меньше не станет. Добавь ко второму варианту

Map<Class, Function> map = new HashMap<>();
map.put(A.class, (args) -> ...))
map.put(B.class, (args) -> ...))
map.put(C.class, (args) -> ...))
map.put(D.class, (args) -> ...))
map.put(E.class, (args) -> ...))
map.put(F.class, (args) -> ...))
map.put(G.class, (args) -> ...))

(ну или список из Pair<Class, Function>, без разницы)

И это хорошо если у тебя аргументы совпадат, иначе сделаешь годобджект Context в котором будет куча мусора. Нафига такое плодить?
Вариант с вот этим Map полезен в случае, когда новые типы приходится время от времени добавлять/убирать/менять. Просто поправил одну строку здесь, и всё.

Если же типов, как в изначальном примере, ровно три, то не вижу смысла вообще изобретать что-то: написать подряд три if и забыть.
источник

S

Sergei in pro.jvm
Денис Чиканов
Я бы ещё поспорил, что из этого проще читать.
Когда ты хреначишь лишнюю абстракцию и слой обработки из ничего, чтобы по сути просто сматчить одну сущность из набора - это повышает когнитивную сложность.
Согласен, вопрос привычки.

Как по мне - стримы часто читаются гораздо проще (дословно, в моем примере написано "среди классов выбрать те, какие приводятся к obj, взять первый попавшийся и выполнить для него действие" - куда уж "лучше читаемость"?)
источник

C

Cargeh in pro.jvm
Sergei
Вариант с вот этим Map полезен в случае, когда новые типы приходится время от времени добавлять/убирать/менять. Просто поправил одну строку здесь, и всё.

Если же типов, как в изначальном примере, ровно три, то не вижу смысла вообще изобретать что-то: написать подряд три if и забыть.
так я написал то, что ты сам посоветовал... просто у тебя не мапа, а список был

короче, ладно, с тобой разговаривать нет смысла☹️
источник

S

Sergei in pro.jvm
Cargeh
так я написал то, что ты сам посоветовал... просто у тебя не мапа, а список был

короче, ладно, с тобой разговаривать нет смысла☹️
А, подожди, я не досмотрел. С Map как раз работать не будет. Нужен список (или любая другая отсортированная коллекция).
источник

ДЧ

Денис Чиканов in pro.jvm
Sergei
А, подожди, я не досмотрел. С Map как раз работать не будет. Нужен список (или любая другая отсортированная коллекция).
...почему?
источник

C

Cargeh in pro.jvm
Sergei
А, подожди, я не досмотрел. С Map как раз работать не будет. Нужен список (или любая другая отсортированная коллекция).
источник

ДЧ

Денис Чиканов in pro.jvm
(я уж молчу, что можно и мапу упорядоченную иметь)
источник