-> <-运算符的作用是什么?


74

我最近遇到了以下代码:

IntPredicate neg = x -> x <- x;

这是什么,某种反向双λ?


50
我的猜测:Lambda(x) -> (x < -x)
tobias_k 2014年

13
这是一个有时对括号有益的例子。
MicSim 2014年

13
Alex

5
@rightfold我不同意。“重复”问题是关于C ++而不是Java的,这个问题是在Java引入lambda表达式之前的几年提出的。
奥利弗·斯普林

4
@rightfold几乎不能保证。您或我可能会遇到,但其他人在辛苦的一天中仍然可能无法解析正在发生的事情。在任何情况下,由于它不是一个完全相同的副本,因此在某种程度上是主观的,并且缺乏亲密的投票似乎表明大多数人都希望保留该问题。
克里斯·海斯

Answers:


91

没有-> <-操作员。第一个->只是Java 8中引入的lambda语法,第二个<-是误导性的“小于”<和“一元减”的串联-

您可以将其读取为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艺术,它只是可读性。
2014年

35
@Gimby我想检查x是否小于3,因为它x <3表达了我对x的爱;)
fredoverflow 2014年

6
x <- 0如果您如此喜欢“反向lambda运算符”,您仍然可以使用…
Holger
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.