Java8 Lambda表达式详解

本文详细介绍了Java8中的Lambda表达式,包括基础语法、语法简化和实际应用示例。Lambda允许将函数作为方法参数,使得代码更简洁。文章还提到了Functional接口的使用,指出Lambda适用于只有一个抽象方法的接口。
摘要由CSDN通过智能技术生成

一、Lambda表达式

Lambda表达式时Java8重要的新特性。lambda允许把函数作为一个方法的参数。使用lambda可以是代码变得更加简洁紧凑,尤其在集合的遍历和其他集合操作中。

Lambda对接口的要求:
使用Lambda表达式可以对某些接口进行简单的实现,但不是所有的接口都可以使用Lambda表达式。
Lambda规定接口中只能有一个必须要被实现的方法,不是规定接口中只能有一个方法。
注意:jdk8中有另外一个新特性:default,被default修饰的方法会有默认实现,不是必须被实现的方法,所以不影响Lambda表达式的使用。

二、Lambda基础语法

语法形式为 ()->{} , 其中 () 用来描述参数列表;{} 用来描述方法体;-> 为lambda运算符,读作goes to。

三、Lambda语法简化

  1. 简化参数类型,参数类型可省略,但必须所有参数类型都不写
public interface TestInterface {
    int add(int a, int b);
}
TestInterface ti = (int a, int b) -> a + b;//接收参数a和b,返回a+b
TestInterface ti = (a, b) -> a + b;
System.out.println(ti.add(2, 3));
  1. 简化参数小括号(),当只有一个参数式可以省略参数小括号
public interface TestInterface {
    int add(int b);
}
TestInterface ti = (a) -> a + 1;//接收参数a,返回a+1
TestInterface ti = a -> a + 1;
System.out.println(ti.add(2));
  1. 简化方法体大括号{},当方法中只有一条语句式,可以省略方法体大括号
TestInterface ti = a -> {return a + 1;};
TestInterface ti = a -> a + 1;
  1. 如果方法体只有一条语句,并且式return语句时,可以省略方法体大括号
TestInterface ti = a -> {return a + 1;};
TestInterface ti = a -> a + 1;

四、Demo

1. 没有参数没有返回值

接口

//专门来修饰函数式接口,要求接口中的抽象方法只有一个。这个注解一般会和lambda表达式一起使用
@FunctionalInterface
public interface NoReturnNoPara {

    void noReturnNoParaMethod();
}

普通写法:

public class Client {

    public static void main(String[] args) {
        Impl impl = new Impl();
        impl.noReturnNoParaMethod();
    }
}

class Impl implements NoReturnNoPara {
    @Override
    public void noReturnNoParaMethod() {
        System.out.println("No Return No Parameter, normal...");
    }
}

匿名内部类:

public class Client {

    public static void main(String[] args) {
        NoReturnNoPara noReturnNoPara = new NoReturnNoPara() {
            @Override
            public void noReturnNoParaMethod() {
                System.out.println("No Return No Parameter, inner class...");
            }
        };
        noReturnNoPara.noReturnNoParaMethod();
    }
}

标准Lambda写法:

public class Client {

    public static void main(String[] args) {
        NoReturnNoPara noReturnNoPara = () -> {
            System.out.println("No Return No Parameter, Lambda...");
        };
        noReturnNoPara.noReturnNoParaMethod();
    }
}

简化Lambda写法

public class Client {

    public static void main(String[] args) {
        NoReturnNoPara noReturnNoPara = () -> System.out.println("No Return No Parameter, Lambda...");

        noReturnNoPara.noReturnNoParaMethod();
    }
}
  1. 一个参数,一个返回值
    接口
@FunctionalInterface
public interface OneReturmOnePara {
    int age(int bir);
}

普通实现

public class Client {

    public static void main(String[] args) {

     OneReturmOnePara onePara = new Impl();
        System.out.println(onePara.age(1992));
    }
}

class Impl implements OneReturmOnePara{

    @Override
    public int age(int bir) {
        return 2020-bir;
    }
}

匿名内部类

public class Client {

    public static void main(String[] args) {

        OneReturmOnePara onePara = new OneReturmOnePara() {
            @Override
            public int age(int bir) {
                return 2020-bir;
            }
        };
        System.out.println(onePara.age(1992));
    }
}

普通Lambda:

public class Client {

    public static void main(String[] args) {

     OneReturmOnePara onePara = (int dir) -> {return 2020-dir;};
        System.out.println(onePara.age(1992));
    }
}

简化Lambda

public class Client {

    public static void main(String[] args) {

     OneReturmOnePara onePara = dir -> 2020-dir;
        System.out.println(onePara.age(1992));
    }
}

五、Funcational接口

其实我们不需要自己去创建接口OneReturmOnePara和NoReturnNoPara, Java8内部定义了一些函数式接口供我们使用,简单案例如下。详解参考另一篇博客Java8 Stream、函数式接口、方法引用(::)详解

public class Client {
    public static void main(String[] args) {
        Function<Integer, Integer> ti = a -> a + 1;
        System.out.println(ti.apply(2));
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值