lambda表达式的简单入门
前言:本人在看《Java核心技术I》的时候对lamdba表达式还不是太上心,只是当做一个Java 8的特性了解一下而已,可是在《Java核心技术II》里面多次用到,所以重新入门来学。
看教程说()->3就是直接输出3这个数字,所以我这么写:
System.out.println(()->3);
果不其然,报错了,错误的提示是:The target type of this expression must be a functional interface.(该表达式的目标类型必须是功能性接口)。也就是时候再怎么不济,最起码接收这个表达式的变量类型也是一个功能性接口吧。本人是Java小白一个,不知道functional interface是什么,索性就直接拿个interface来写了。
public class LambdaTest{ interface Test{ void sayMessage(String message); } public static void main(String[] args) { Test t = message->System.out.println(message); t.sayMessage("3"); //为什么不能是int类型的3呢?因为在接口里面就已经声明了sayMessage方法的参数是一个String类型的变量。 } }
以上一个很简单的输出语句。但是也要经过:创建接口->定义方法->实现方法这几个步骤才能实现System.out.println()语句。
那假设我想要用lambda表达式进行加法运算呢?可以直接用()->1+2得到吗?答案是肯定不行啊!那可以直接用上面的代码修改成message->1+2吗?答案也是不行滴。为什么呢?请看报错的信息先:Void methods cannot return a value。当初是你要void,void就void,现在又要用int,把value return回来 。
那么重新改下代码,改成这样子:
interface Test{ int sayMessage(String message); } public static void main(String[] args) { Test t = message->1+2; System.out.println(t.sayMessage("1")); }
会发现,打印出来的值是3,传入的参数"1"没有任何作用,那留着"String message"这个参数做什么呢?过年加菜吗?所以可以改成:
interface Test{ int sayMessage(); } public static void main(String[] args) { Test t = ()->1+2; //此处不需要参数,因为lambda表达式中没有参数。 System.out.println(t.sayMessage()); }
结果依然是打印出3。