Что делает оператор &#8594; <-?

Недавно я пришел к следующему коду:

IntPredicate neg = x -> x <- x;

Что это такое, какая-то обратная двойная лямбда?

Ответ 1

Нет оператора -> <-. Первый -> - это просто синтаксис лямбда, который представлен в 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);.