Посоветуйте что нибудь чтобы хорошо разобраться в лямбда выражениях. А то столкнулся с задачей и не до конца понимаю логику построения
public static <T, U> Function<T, U> ternaryOperator(
Predicate<? super T> condition,
Function<? super T, ? extends U> ifTrue,
Function<? super T, ? extends U> ifFalse) {
return x -> condition.test(x) ? ifTrue.apply(x) : ifFalse.apply(x); // your implementation here
}
\
Особенно откуда берется параметр x. Я понимаю что он должен быть типа T. но все равно не ложится в голову откуда он взялся))
И почему именно такая конструкция <? super T, ? extends U>. В общем беда)
alex_us
41 уровень
Помогите разобраться с лямбдами
Решен
Комментарии (10)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Justinian Judge в Mega City One Master
1 марта 2021, 11:55
если в функциональный интерфейс будет передаваться параметр, он должен как-то обозначаться. Можно назвать return x -> ..., можно назвать return svetaSokolova -> суть в том, что это обозначение аргумента, который пошлют в твой функциональный интерфейс,
представь это как:
вот этот x -> берется в самом коде, где будет вызываться твой функциональный интерфейс.
Конкретно в твоем примере, дженерики опустим, по них материалов вагон, по твоему конкретному вопросу ответил Артем, дженерики еще подчитай, те моменты, которые ты чувствуешь что плаваешь или неуверенно чувствуешь.
По лямбде, если упростить:
то это метод, который возвращает определенный функциональный интерфейс, который можно применять, и когда у этого функционального интерфейса Function будут вызывать метод apply, то будут передавать аргумент х.
Посмотри следующий код, все что имеет нумерацию 1, 2, 3 с одинаковыми именами - оно взаимозаменямо, просто разные способы записи одного и того же.
В этом примере, я убрал дженерики почти, чтобы упростить, код выполняет следующую функцию.
Есть строка. Считается что она содержит либо Double либо Integer, ternaryOperator проверяет входящий аргумент - строку. Если это интеджер, то возвращает Integer, иначе возвращает Double
+1
Justinian Judge в Mega City One Master
1 марта 2021, 11:56
0
Justinian Judge в Mega City One Master
1 марта 2021, 12:03
0
Justinian Judge в Mega City One Master
1 марта 2021, 12:04решение
Просмотри код, чтобы все там было предельно ясно, если какие-то вопросы или непонятки, спрашивай.
по стримам и лямбдам, лучшее из книг это серия in Action :
Java 8 in Action
Java 9 in Action
Modern Java in Action
+
- примеры в коде bobocode - lambda, stream, optional tutorials
- упражнения https://github.com/bobocode-projects/java-fundamentals-course/tree/main/5-0-functional-programming
(есть автопроверка - юнит тесты + обязательно нужно сверяться с веткой Completed это решение преподавателя, чтобы было представление как нужно писать)
+ самому писать по принципу
(в учебных целях, для тренировки)

+2
hidden #2322530
1 марта 2021, 12:24
разве это best practices везде подряд пихать стримы? кроме тех случаев, когда можно использовать parralel stream
0
Justinian Judge в Mega City One Master
1 марта 2021, 12:57
parallel stream можно использовать во многих случаях, вопрос в том, а нужно ли.
Я хотел дописать, но забыл, уже откорректировал - про учебные цели.
Но, в реальных проектах, если вместо foreach fori можно написать стрим - будут писать стрим скорее всего, если не будет нюансов с их использованием или со стримами код получится хуже, чем без них.
0
hidden #2322530
1 марта 2021, 13:03
понял.
0
hidden #598481
1 марта 2021, 13:22
Но, в реальных проектах, если вместо foreach fori можно написать стрим - будут писать стрим скорее всего, если не будет нюансов с их использованием или со стримами код получится хуже, чем без них.
Три раза перечитал и все равно не понял :) Кто на ком стоял?
0
hidden #2322530
28 февраля 2021, 10:58
И почему именно такая конструкция <? super T, ? extends U>. В общем беда)
это wildcards по принципу PECS
ссылка на хабр
0
Aleksei Software Engineer в Cisco Expert
27 февраля 2021, 22:39
Доки хороши, чтобы разобраться: https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
0