jdk8的新特性之lambda表达式

在学习Lambda表达式之前,我们先得到了解一个知识点叫做 函数式接口

函数式接口

只有一个抽象方法的接口,叫函数式接口,它是Lamdba表达式的使用前提。

在学习多线程的时候Runnable接口就是一个函数式接口,如下

public interface Runnable{
  public void run();
}

在学习Collections工具类的的[sort](chapter5\5.2 Collections.html#方法演示 )方法时,我们讲到Comparator接口用于可以用于排序。

public interface Comparator<T>{
  public int compare(T o1,To2);
}

匿名内部类的冗余问题

Lambda表达式可以用来解决匿名内部类代码冗余的问题,先来看一下匿名内部类的冗余问题。

public static void main(String[] args){
  //创建一个线程
  new Thread(new Runnable(){
    //复写run方法
    public void run(){
      for(int i=1;i<=100;i++){
        System.out.println(i);
      }
    }
  }).start();
}

观察上面代码,我们发现创建线程对象时,需要传递一个Runnable接口的实现类。而Runnable接口的实现类又必须复写run方法。那么问题来了,仔细想想是不是这样, 既然只一个run方法,并且又必须复写run方法,倒不如不写这些代码,让编译器自动推导!!!

Lambda表达式就能解决上面匿名内部类代码冗余的问题,其实只是省略了匿名内部类的一些代码,所以有人说Lambda表达式是一个 语法糖

Lambda表达式改进

所以代码就编程这个样子

public static void main(String[] args){
  //创建一个线程
  new Thread(
    //省略了new Runnable和run方法的声明,直接做具体的事情即可
    ()->{
      for(int i=1;i<=100;i++){
        System.out.println(i);
      }
    }
  ).start(); 
}

Lambda表达式的格式

Lambda表达式的格式有标准格式和好几种缺省格式。如下

1. 标准格式:
    (Type1 param1,Type2 param2)->{return 语句体;}

2. 编译器都可以推断出lambda表达式的参数类型,所以参数类型可以省略
    (param1,param2)->{return 语句体;}

3. 当lambda表达式的参数个数只有一个,可以省略小括号
    param->{return 语句体;}

4. 当lambda表达式只包含一条语句时,可以省略大括号、return和语句结尾的分号`;`
    param->语句体

当方法的参数是函数式接口时,在调用该方法时,就可以直接传递Lamdba作为参数。这也叫函数式编程。

//有一个函数式接口
public interface MathOperation{
  //对于两个整数 a和b进行计算,怎么计算不知道
  public int calc(int a,int b);
}
//方法的参数是MathOperation接口
public static void test(MathOperation op){
    int result=op.calc(10,20);
}

调用以上test方法时传递Lamdba表达式作为MathOperation接口的实例实现

//测试类
public class Test1{
  public static void main(String[] args){
    //调用test方法,传递匿名内部类作为MathOperation接口的实例
    test(new MathOperation(){
      public int calc(int a,int b){
        //实现方式,对a和b求和
        int sum=a+b;
        return sum;
      }
    });

    //使用Lambda表达式,作为MathOperation接口的实例
    test((int a,int b)->{
        //实现方式,对a和b求和
        return a+b;
      }
    );
    //使用Lambda缺省格式,作为MathOperation接口的实例
    test((a,b)->a+b);
  }
}

Lambda表达式练习2

/*
有一个数组{88,99,22,33,44,77,11,66,55},对数字升序降序排列
*/
public class Test1{
  public static void main(String[] args){
    Integer[] arr={88,99,22,33,44,77,11,66,55};
    //sort方法第二个参数是一个Comparator接口,使用Lambda表达式作为实例接口。
    Arrays.sort(arr,(o1, o2) -> o2-o1);
  }
}

Ladmba总结
Lamdba表达式可以简化匿名内部类的书写,提高编写代码的效率,也是函数式编程的重要体现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值