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

 

posted @ 2018-05-09 18:16  NYfor2018  阅读(1449)  评论(0编辑  收藏  举报