Що робить оператор -> <-?


74

Нещодавно я натрапив на такий код:

IntPredicate neg = x -> x <- x;

Що це, якась зворотна подвійна лямбда?


50
Моє припущення: Лямбда(x) -> (x < -x)
tobias_k

13
Це приклад, для чого деколи корисні дужки.
MicSim

13
Можливо, це пов’язано з оператором
Алекс

5
@rightfold я не згоден. Питання "дублікату" стосується C ++, а не Java, і це питання було задано за роки до того, як Java представила лямбда-вирази.
Олівер Спрін,

4
@rightfold Це навряд чи гарантовано. Ви чи я, але хтось інший, хто переживає важкий день, все одно може мати проблеми з аналізом того, що відбувається. У будь-якому випадку, оскільки це не точна копія, вона стає дещо суб'єктивною, і відсутність тісних голосів, мабуть, свідчить про те, що більшість людей хочуть, щоб питання залишилося.
Chris Hayes

Відповіді:


91

-> <-Оператора немає . Перший ->- це просто лямбда-синтаксис, представлений у Java 8, а другий <-- оманливе об’єднання „менше, ніж“ <та „одинарний мінус“ -.

Ви можете прочитати це як IntPredicate neg = (x) -> (x < (-x));, тобто він перевіряє, чи xменше, ніж -x, що має місце для всіх (ну, більшість ) негативних чисел, звідси і назва neg.

IntPredicate neg = x -> x <- x;
System.out.println(neg.test(4));   // false
System.out.println(neg.test(0));   // false
System.out.println(neg.test(-4));  // true

Тільки для повноти: Цей тест не тільки (навмисно?) Важко зрозуміти, але - як зазначено в коментарях - він також не відповідає Integer.MIN_VALUE(що є ==-Integer.MIN_VALUE). Натомість слід, мабуть, просто скористатися набагато простішим IntPredicate neg = x -> (x < 0);.


17
"що стосується всіх від'ємних чисел" ... крім Integer.MIN_VALUE;)
fredoverflow

7
@MarkRotteveel ваша версія не схожа на мистецтво ASCII, її просто можна прочитати.
Gimby

35
@Gimby Я люблю перевіряти, чи х менше 3, бо x <3висловлює свою любов до х;)
fredoverflow

6
Ви все ще можете використовувати, x <- 0якщо вам так подобається “зворотний лямбда-оператор” ...
Холгер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.