Lambda语法以及相关注意事项

通常在刚学习Java不久的朋友们,通常还不知道Lambda表达式是什么东西,偶尔可能在某些地方看到一些奇奇怪怪的java语句,觉得很陌生,感觉不像Java的语法。没错,这就是Java语言中一种特殊的语法:Lambda语法

先请大家看看:

Lambda语法的省略规则

  • 小括号内参数的类型可以省略;
  • 如果小括号内有且仅有一个参,则小括号可以省略;
  • 如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号、return关键字及语句分号。

Lambda的使用前提

  • 使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法。无论是JDK内置的 Runnable 、 Comparator 接口还是自定义的接口,只有当接口中的抽象方法存在且唯一 时,才可以使用Lambda。
  • 使用Lambda必须具有上下文推断。也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。

** 下面请看代码:**

我们在了解Lambda使用前提后,我们知道需要使用接口,我们首先来回顾接口的使用方法:

定义接口:

package com.test03;
/**
 * 定义接口A
 */
public interface A {
    void study();
}

接口使用方法一:

package com.test03;
/**
 * 接口的使用方法一:外部类方法
 */
public class Demo01 {
    public static void main(String[] args) {
        //创建已经实现了A接口的类的对象
        MyA myA = new MyA();
        //使用对象中的方法
        myA.study();
    }
}

//在类外面创建一个新的类,实现A接口
class MyA implements A{
    @Override
    public void study() {
        System.out.println("外部类实现了A接口");
    }
}

运行结果:
在这里插入图片描述
接口使用方法二:

package com.test03;
/**
 * 接口的使用方法二:内部类方法
 */
public class Demo02 {
    public static void main(String[] args) {
        //创建内部类实现A接口
        class MyA implements A{
            @Override
            public void study() {
                System.out.println("内部类实现了A接口");
            }
        }
        //创建MyA对象
        MyA myA = new MyA();
        myA.study(); //使用对象的方法
    }
}

运行结果:
在这里插入图片描述
接口使用方法三:

package com.test03;
/**
 * 接口的使用方法三:匿名内部类方法
 */
public class Demo03 {
    public static void main(String[] args) {
        // 创建了一个已经实现了A接口里面方法的类并且实例化,但该对象没有名字
        new A() {
            @Override
            public void study() {
                System.out.println("匿名内部类实现类A接口");
            }
        }.study();
    }
}

运行结果:
在这里插入图片描述
回顾完接口的使用方法后,我们来看看Lambda表达式是如何对接口进行简化语法的。下面分两种情况对Lambda表达式进行展示:

接口做方法参数的情况:

传统语法格式:

package com.test03;

/**
 * 当接口作为方法的参数是,Lambda表达式的使用
 */
public class Demo04 {
    public static void main(String[] args) {
        // TODO 调用本类的方法
        /**
         * 由于调用方法是需要的是一个接口A类型的对象,但是接口还没被实现
         * 下面为了方便,直接用匿名内部类的方法来实现A接口
         */
        usingA(new A() {
            @Override
            public void study() {
                System.out.println("接口A被实例化后,当做方法的参数啦");
            }
        });
    }
    //定义一个方法,这个方法的功能是调用A接口中的方法
    public static void usingA(A a){
        a.study();
    }
}

使用Lambda表达式:

初步简化:

package com.test03;

/**
 * 当接口作为方法的参数是,Lambda表达式的使用
 */
public class Demo05 {
    public static void main(String[] args) {
        usingA(() -> { System.out.println("接口A被实例化后,当做方法的参数啦"); });
    }
    //定义一个方法,这个方法的功能是调用A接口中的方法
    public static void usingA(A a) {
        a.study();
    }
}

进一步简化:

package com.test03;

/**
 * 当接口作为方法的参数是,Lambda表达式的使用
 */
public class Demo05 {
    public static void main(String[] args) {
        usingA(() -> System.out.println("接口A被实例化后,当做方法的参数啦"));
    }
    //定义一个方法,这个方法的功能是调用A接口中的方法
    public static void usingA(A a) {
        a.study();
    }
}

PS : 简化的情况还有相当的多,就不逐一介绍,大家可以去看想想资料,这里只描述一些常用的情况

接口做局部变量的情况:

(略)

Lambda表达式之-方法引用

Lambda表达式的另外一种语法情况,是Lambda的语法的精简再精简,有一以下三种情况:

  • 对象::方法名
  • 类名::方法名
  • 类名::new

使用举例:(略)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值