JAVA8新特性1——Lambda表达式

JAVA8新特性1——Lambda表达式

下面用一个代码来初体验lambda表达式的使用

import java.util.Arrays;
import java.util.Comparator;

public class LambdaDemo1 {
    public static void main(String[] args) {
        Integer[] arr = {2,3,4,5,6,7,1,3,2};
		//第一种写法
        Arrays.sort(arr, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2;
            }
        });
        
        //第二种写法:lambda表达式的写法
        Arrays.sort(arr,(Integer o1, Integer o2) -> {
                return o1 - o2;
            }
        );
        System.out.println(Arrays.toString(arr));
    }
}

从上面的代码我们可以看出lambda的一个很大的优点就是代码简洁。lambda表达式是函数式编程思想的一种应用

函数式编程

  • 可以把函数作为参数传递给另一个函数
  • 可以返回一个函数,这样就可以实现闭包或者惰性计算

面向对象

先找对象,让对象做事情,采用面向对象编程时,我们往往需要先创建一个对象,再调用对应类的方法

二者的区别

数据存放方式

1、对于OO(面向对象,下同),数据存放在对象的属性(成员变量)里面,以及静态成员(全局变量)

2、对于函数式,数据存放在闭包(各级作用域)里面,作用域包括全局作用域。

数据访问方式

数据存放方式决定了访问的方式。

1、对于OO来说,访问数据(全局变量除外)需要先获取对象的引用,然后再进行操作(直接访问——公共属性,或者调用成员函数/方法访问——私有属性)

2、对于函数式,访问数据是直接访问(通过函数入参或者作用域链查找)

Lambda表达式的注意点

  1. lambda表达式可以用来简化匿名内部类的书写
  2. lambda表达式只能简化函数式接口的匿名内部类的方法
  3. 函数式接口:有且仅有一个抽象方法的接口叫做函数式接口,接口上方可以加@FunctionalInterface注解

lambda改写函数式接口的匿名内部类实现

import java.util.Arrays;
import java.util.Comparator;

public class LambdaDemo2 {
   public static void main(String[] args) {

       //1.利用匿名内部类的形式去调用下面的方法
       //调用一个方法的时候,如果方法的形参是一个接口,那么我们要传递这个接口的实现类对象
       //如果实现类对象只要用到一次,就可以用匿名内部类
       //method括号里面是一个实现了Swim接口的对象  即Swim接口的实现类对象
       method(new Swim() {
           @Override
           public void swimming() {
               System.out.println("正在游泳");
           }
       });

       //2.利用lambda表达式进行改写
       method(
               ()->{  //因为swimming方法没有参数,所以括号为空
                   System.out.println("正在游泳");
               }
       );

   }
   public static void method(Swim s){
       s.swimming();
   }
}
interface Swim{
   public abstract void swimming();
}

lambda写法掌握:只关注方法体,不关心方法的名字和对象,形参和方法体之间加上->

总结

  1. lambda表达式的基本作用:简化函数式接口的匿名内部类的写法
  2. lambda表达式有什么使用前提:必须是接口的匿名内部类,接口中只能有一个抽象方法
  3. lambda的好处:
    lambda表达式是一个匿名函数,不需要创建对象就可以直接写出方法体,可以理解为是一段可以传递的代码,可以写出更简洁、更灵活的代码

lambda表达式的省略写法

省略核心:可推导,可省略

省略规则
  • 参数类型可省略
  • 如果只有一个参数,参数类型可省略,同时()可以省略
  • 如果lambda表达式的方法体只有一行,大括号、分号、return可以省略不写,三者需要同时省略
import java.util.Arrays;
import java.util.Comparator;

public class LambdaDemo1 {
    public static void main(String[] args) {
        Integer[] arr = {2,3,4,5,6,7,1,3,2};

        Arrays.sort(arr, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2;
            }
        });
        
        //下面是lambda表达式的写法
        Arrays.sort(arr,(Integer o1, Integer o2) -> {
                return o1 - o2;
            }
        );
        //下面是lambda表达式的省略写法
        Arrays.sort(arr,(o1,o2) -> o1 - o2);
        System.out.println(Arrays.toString(arr));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光阿盖尔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值