Lambda表达式及接口方法的普及

1 篇文章 0 订阅
1 篇文章 0 订阅

简介

Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。

对接口的要求

虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不是所有的接口都可以使用 Lambda 表达式来实现。Lambda 规定接口中只能有一个需要被实现的方法,(接口中的抽象方法都是要必须被实现的)。不是规定接口中只能有一个方法,因为JDK8之前规定接口只能有抽象方法,不能有带方法体的方法。这里普及一下jdk不同版本规定接口里的内容
如果是Java 7,那么接口中可以包含的内容有:

  1. 常量
  2. 抽象方法

如果是Java 8,还可以额外包含有:
3. 默认方法
4. 静态方法

如果是Java 9,还可以额外包含有:
5. 私有方法

jdk 8 中有另一个新特性:default, 被 default 修饰的方法会有默认实现,不是必须被实现的方法,所以不影响 Lambda 表达式的使用。

接口使用步骤:

  1. 接口不能直接使用,必须有一个“实现类”来“实现”该接口。
    格式:
public class 实现类名称 implements 接口名称 {
    // ...
}
  1. 接口的实现类必须覆盖重写(实现)接口中所有的抽象方法。
    实现:去掉abstract关键字,加上方法体大括号。
  2. 创建实现类的对象,进行使用。

接口的抽象方法

package cn.itcast.day10.demo01;
 
/*
在任何版本的Java中,接口都能定义抽象方法。
格式:
public abstract 返回值类型 方法名称(参数列表);
注意事项:
1. 接口当中的抽象方法,修饰符必须是两个固定的关键字:public abstract
2. 这两个关键字修饰符,可以选择性地省略。
3. 方法的三要素,可以随意定义。
 */
public interface MyInterfaceAbstract {
    // 这是一个抽象方法
    public abstract void methodAbs1();
    // 这也是抽象方法
    abstract void methodAbs2();
    // 这也是抽象方法
    public void methodAbs3();
    // 这也是抽象方法
    void methodAbs4();

必须通过实现类,来实现该接口,以上实现类覆盖重写了接口中所有抽象方法,只要有一个未重写,那么这个实现类自己就必须是抽象类。

@FunctinonalInterface 注解的作用
专门用来修饰函数式的接口,要求接口中的抽象方法只有一个,这个注解一般会和Lambda表达式一起使用

@FunctinonalInterface
public interface Test{

  void method()//接口里只有一个必须实现的抽象方法
   
  default void defaultMethod(){//实现类调用
   System.out.println("这是默认方法,实现类不必强制实现");
 }
  static void staticMethod(){
   System.out.println("这是静态方法,实现类无法继承");
  }

}
 //匿名内部类
 public static void main(String[] args){
        test t =new test(){    //test是一个接口
            @Override
            public void method(){
                System.out.println("1222323");
            }

        };

    t.method();

换成lambda表达式

public static void main(String[] args){
//无参无返回
test t=()->{
    System.out.println("1222323");
}
t.method();

//带参数形式无返回
test t=(int a)->{
    System.out.println("1222323"+a);
}
t.method(6);//无参有返回值
test t=( )->{
    System.out.println("1222323");
return 1;
}
int a=t.method();//接受他的返回值//带参有返回
test t=(int a )->{
  System.out.println("1222323"+a);
return 1;
}
int a=t.method(6);//接受他的返回值

lambda表达式简化

//简化参数类型,可以不写参数类型,但必须所有参数都不写
test t=(a,b)->{
    System.out.println("1222323"+a+b);
}
t.method(6,7);//简化参数小括号,如果只有一个参数,可以省略小括号
test t=a->{
    System.out.println("1222323"+a);
}
t.method(6);//简化方法体大括号,如果方法只有一条语句,则可以省略方法体大括号
test t=()->System.out.println("1222323");
t.method();//如果方法体只有一条语句,并且是return语句,则可以省略方法体大括号
test t=a->a+3;
int c=t.method(5);

test t=(a,b)->a+b;
int c=t.method(5,6);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值