Was macht der Operator -> <-?

74

Ich bin kürzlich auf folgenden Code gestoßen:

IntPredicate neg = x -> x <- x;

Was ist das, eine Art umgekehrtes Doppel-Lambda?

Fredoverflow
quelle
50
Meine Vermutung: Lambda(x) -> (x < -x)
tobias_k
13
Das ist ein Beispiel dafür, wofür Klammern manchmal gut sind.
MicSim
13
Vielleicht hängt es mit dem -> Operator
Alex
5
@rightfold Ich bin anderer Meinung. Die "doppelte" Frage bezieht sich auf C ++, nicht auf Java, und diese Frage wurde Jahre vor der Einführung von Lambda-Ausdrücken durch Java gestellt.
Oliver Spryn
4
@rightfold Das ist kaum garantiert. Sie oder ich könnten, aber jemand anderes, der einen harten Tag durchmacht, könnte immer noch Probleme haben, zu analysieren, was los ist. Da es sich nicht um ein genaues Duplikat handelt, wird es auf jeden Fall etwas subjektiv, und das Fehlen enger Abstimmungen scheint darauf hinzudeuten, dass die meisten Menschen möchten, dass die Frage bleibt.
Chris Hayes

Antworten:

91

Es gibt keinen -> <-Operator. Das erste ->ist nur die in Java 8 eingeführte Lambda-Syntax, und das zweite <-ist eine irreführende Verkettung von 'kleiner als' <und 'unärem Minus' -.

Sie können es lesen als IntPredicate neg = (x) -> (x < (-x));, dh es wird geprüft, ob xes kleiner als ist -x, was für alle (nun ja , die meisten ) negativen Zahlen der Fall ist, daher der Name 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

Nur der Vollständigkeit halber: Dieser Test ist nicht nur (absichtlich?) Schwer zu verstehen, sondern schlägt - wie in den Kommentaren ausgeführt - auch fehl Integer.MIN_VALUE(was ist ==-Integer.MIN_VALUE). Stattdessen sollten Sie wahrscheinlich nur die viel einfachere verwenden IntPredicate neg = x -> (x < 0);.

tobias_k
quelle
17
"was für alle negativen Zahlen der Fall ist" ... außer Integer.MIN_VALUE;)
Fredoverflow
7
@MarkRotteveel Ihre Version sieht nicht wie ASCII-Grafik aus, sondern ist nur lesbar.
Gimby
35
@ Gimby Ich überprüfe gerne, ob x kleiner als 3 ist, weil x <3meine Liebe zu x zum Ausdruck kommt;)
Fredoverflow
6
Sie können immer noch verwenden, x <- 0wenn Sie den "Reverse Lambda Operator" so sehr mögen ...
Holger