Lambda表达式

Lambda表达式

概述

Lambda表达式是java对数学函数表达式的一种体现形式,本质是一个值,在java中主要是体现在对特殊的匿名内部类对象的一种表示,代表匿名内部类的对象。

只有该接口是一个函数式接口,才可以使用Lambda表达式来代替匿名内部类。

也可以理解为Lambda表达式是匿名内部类格式的一种简化,但是本质不一样。

也可以理解为Lambda表达式就是一个函数式接口的对象,也可以理解为是对函数式接口的一个补充和完整。

函数式接口概述

有且只有一个抽象方法的接口就是函数式接口,函数式接口只有一个抽象方法,其他方法可以有任意多个。

格式

标准格式:【三个一:一个小括号 一个箭头 一个花括号】
(参数列表) -> {执行代码段}

格式解释:
(参数列表):是匿名内部类中重写的抽象方法的方法参数列表,此参数列表不需要书写数据类型,只写变量名即可。
【就是接口抽象方法的参数列表】
->:原封不动 他是lambda表达式的标志
{执行代码段}:lambda表达式对接口抽象方法的重写

普通格式
public class D01入门 {
    public static void main(String[] args) {
//        这个匿名内部类所表达的信息  主要是对work方法的实现
        Usb u = new Usb(){
            @Override
            public void work() {
                System.out.println("鼠标点点点");
            }
        };
        u.work();
        Usb u1 = () -> {System.out.println("键盘敲敲敲");};
        u1.work();
    }
}
//函数式接口
interface Usb {
    void work();
}
当做参数传递和对象返回
public class D02 {
    public static void main(String[] args) {
        Usb usb = getUsb();
        usb.work();
//        使用一个usb设备
        useUsb(() -> {System.out.println("键盘敲敲敲");});
    }
//    此方法要求返回一个Usb对象
    public static Usb getUsb(){
        return () -> {System.out.println("鼠标点点点");};
    }
//    使用一个Usb的设备
    public static  void useUsb(Usb u ){
        u.work();
    }
}

Lambda表达式的省略原则

概述 在符合一定条件下Lambda表达式的格式可以进行简化的

具体原则

1、小括号参数的参数类型可以直接省略
2、小括号的参数有且只有一个的时候,小括号可以省略 【没有和多个都不能省略,只有一个参数能省略】
3、花括号中有且只有一个执行语句的时候,可以同时省略花括号 分号 和 return关键字
	【要省略三者同时省略,否则一个都不要省略】
4、小括号和花括号的省略原则互不干扰,各省略各的
代码示例
public class D03{
    public static void main(String[] args) {
//        省略参数的类型
        A a =  (x,y) -> {
            System.out.println(x + y);
        };
        a.show("哈哈", 33);
//        省略小括号
        B b = e -> {
            System.out.println(e.length());
        };
        b.methodB("哈哈你个嘚嘚");
//        省略return关键字和大括号
        C c = x ->  x.length();
        System.out.println(c.getLength("哈哈"));
    }
}
interface  A {
    void  show (String name ,int age );
}
interface B {
    void methodB (String x );
}
interface C {
    int getLength(String s );
}

方法引用

方法引用是对函数式接口的实现类对象体现的另一种方式

特殊条件

如果Lambda表达式表达的信息,在其他的类当中,已经被其他的方法所实现过了
该Lambda表达式就可以使用其他类的实现了该方法的引用去进行代替
如果符合条件,方法引用可以当做函数式接口的对象。

使用前提

1、有且只有一个抽象方法的接口【函数式接口】
2、必须有上下文推断

方法引用的格式

静态方法引用:
类名 :: 静态方法名

普通方法引用:
对象名 :: 普通方法名

构造方法的引用:
类名 :: new

代码示例
public class D04 {
    public static void main(String[] args) {
//        本次lambda表达式表达的信息是返回两个数字之间比较大的值
        N n = (x, y) -> x > y ? x : y;
        System.out.println(n.number(1.1, 1.2));

//        使用方法引用创建N的对象  静态方法  类名 :: 方法名
        N n1 = Math::max;
        System.out.println(n1.number(3, 2));

//        非静态的方法引用  对象名 :: 方法名
        N n2 = new D04方法引用() :: sum;
        System.out.println(n2.number(3, 10));
    }

//    非静态方法
    public double sum(double d1, double d2) {
        return d1 + d2;
    }
}

interface N {
    double number(double d1, double d2);
}
构造方法的方法引用
public class D05 {
    public static void main(String[] args) {
//        Lambda表达式形式
        FactoryCat fc = (x, y) -> new Cat(x, y);
        Cat hh = fc.getCat("花花", 3);

//        使用构造方法引用
        FactoryCat fc2 = Cat::new;
        Cat beibei = fc2.getCat("贝贝", 2);

    }
}

class Cat {
    String name;
    int age;

    public Cat() {
    }

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

interface FactoryCat {
    Cat getCat(String name, int age);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值