zoukankan      html  css  js  c++  java
  • Lambda表达式

    在Java1.8以后,推出了函数式编程的解决方案。初学几个月的朋友一定对这样:() -> {} 的东西恐惧又陌生。这是啥呀,这怎么用啊?

    一、函数式编程:拷贝小括号,写死右箭头,落地大括号!!!

      在介绍Lambda表达式之前,先来了解一下函数式接口。所谓的函数式接口,就是接口中只有一个抽象方法。在8版本更新以后,接口中允许出现default方法和static方法。也就是说函数式接口中允许一个抽象方法,若干个default方法或者static方法。

      你可能使用过Runnable接口:

    @FunctionalInterface
    public interface Runnable {
        public abstract void run();
    }

      这就是函数式接口,符合只有一个接口的规范。你可能也见过别人这么定义一个线程:

     new Thread(() -> {
       //run方法的业务
    }).start();

      初次接触我也很排斥,可能是这破坏了某种编程习惯,但你相信我,当你会使用她以后,你会深深爱上她。

      上面我们说一个函数式接口中只有一个抽象方法,在使用Lambda表达式中的() -> {}就是对此抽象方法的实现。()就是抽象方法名后面的括号,有参数连带参数一起粘贴就行:(形参)。而  ->  是写死的运算符。那么 { 业务逻辑 }  其实就是对抽象方法的实现。而@FunctionalInterface注解就是显示的指定这是一个函数式接口,当你给一个接口加上@FunctionalInterface注解后,如果你给此接口定义两个抽象方法,那么编译器就会报错。

      所以这段代码:new Thread(() -> {}).start;  其中高亮部分就等价于new Runnable(public void run(){}),如果你用Lambda表达式创建线程,会比使用传统抽象类的方法省去不少功夫。

    二、案例:

    @FunctionalInterface
    interface Foo{
        public int add(int x,int y);
    
        default int mul(int x,int y ){
            return x*y;
        }
        static int div(int x,int y ){
            return x/y;
        }
    }
    
    public class LambdaExpressDemo02 {
        public static void main(String[] args) {
    //        Foo foo = new Foo() {
    //            @Override
    //            public int add(int x, int y) {    接口中的唯一的方法
    //                return x+y;
    //            }
    //        };
            Foo foo =  (int x,int y) -> {return x+y; };
    
            System.out.println(foo.add(3,5));
            System.out.println(foo.mul(3,5));
            System.out.println(Foo.div(15,5));
        }
    }

      (int x,int y)  ->  { return x+y; };,等价于 new Foo() { public int add( int x, inty )  { return x+y; } }。并且案例中也演示了定义和使用接口的default方法和static方法(default方法由接口的实例调用,static有接口自身调用)。

       所以Lambda其实就这么简单,记住口诀就行了:拷贝小括号,写死右箭头,落地大括号

      1、先把接口的抽象方法名后面的 () 连带形参一起粘贴过来。

      2、-> 固定写死

      3、{抽象方法的实现}

    想到到这里我只要稍微一提:为什么函数式接口只能有一个抽象方法?因为定义多了他就不能唯一确定是去实现哪一个方法了啊!

  • 相关阅读:
    【转】awk内置变量
    【转】awk数组操作
    【转】awk 数组用法【精华贴】
    【转】linux shell 逻辑运算符、逻辑表达式
    指挥作战
    人脸相关
    TD
    后台
    前台 html 空格
    linux
  • 原文地址:https://www.cnblogs.com/superlsj/p/11649358.html
Copyright © 2011-2022 走看看