-> 是Lambda表达式,也叫Lambda函数,是Java 8 的新特性。

JAVA 中的 ->  Lambda函数_编译器

Lambda可以读作 “浪马达”。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。

Lambda表达式的基本语法:

(parameters) -> expression

(parameters) ->{ statements; }

以下是lambda表达式的重要特征:

可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值

Lambda 表达式实例
Lambda 表达式的简单例子:
一:

    // 1. 不需要参数,返回值为 5  
    () -> 5  
      
    // 2. 接收一个参数(数字类型),返回其2倍的值  
    x -> 2 * x  
      
    // 3. 接受2个参数(数字),并返回他们的差值  
    (x, y) -> x – y  
      
    // 4. 接收2个int型整数,返回他们的和  
    (int x, int y) -> x + y  
      
    // 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
    (String s) -> System.out.print(s)

二:

String[] days = {" Monday", "Tuesday",  
       "Wednesday", "Thursday",
       "Friday",  "Saturday",    
       "Sunday"};  
List<String> allDays =  Arrays.asList(days);  
  
// 以前的循环方式  
for (String allDay : allDays) {  
     System.out.print(allDay + "; ");  
}  
  
// 使用 lambda 表达式以及函数操作(functional operation)  
allDays.forEach((allDay) -> System.out.print(allDay + "; "));  
   
// 在 Java 8 中使用双冒号操作符(double colon operator)  
allDays.forEach(System.out::println);  

以上三种输出结果都是一样

我们平常写的for循环,用到了lambda 表达式,形式会有所不一样,但结果是一样的。代码看起来就高逼格一点了。

//双冒号运算操作符是类方法的句柄,lambda表达式的一种简写  
方法调用
person -> person.getAge();
可以替换成
Person::getAge

x -> System.out.println(x)
可以替换成
System.out::println

简单总结一下 Lambda函数的优缺点
优点:简洁,减少代码冗余
缺点:难懂,难以调试

用多了的话,就会习惯了。