Java学习之Lambda表达式的使用详解

目录
  • Lamda表达式
  • 函数式接口
  • Lambda表达式的推导
  • 函数式接口的不同类型
  • Lambda表达式与函数式接口的简单应用
  • Lambda表达式的优缺点

Lamda表达式

λ希腊字母表中排序第11位的字母,英文名称为Lambda,它Lambda表达式是Java SE 8中一个重要的新特性,允许通过表达式来代替功能接口,它与其他方法相同,提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块),实际上是属于函数式编程的概念:

语法如下:

(参数) ->表达式 或 (参数) ->{ 语句; }

Lambda表达式允许你直接把一个代码块赋值给一个变量

无参有返回值Lambda表达式:

() -> 2    //该Lambda表达式表示返回值为2

有参有返回值Lambda表达式:

一个参数:

x -> 2 * x    //x为参数,返回2*x的值

2个参数:

(x, y) -> x + y    //x,y均为参数,返回两者的和

有参无返回值Lambda表达式:

(String s) -> System.out.print(s)    //s为参数,将其输出

为什么要使用lambda表达式?

  • 避免匿名内部类定义过多
  • 可以让代码看起来很简洁
  • 去掉了大量没有意义的代码,只留下核心的逻辑

在讲如何使用Lamda表达式之前,我们先来学习一下FunctionalInterface (函数式接口)

函数式接口

任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口,对于函数式接口,我们可以通过lambda表达式来创建该接口的对象

举例:

//定义函数式接口
interface mylike{
    void lambda();
}

JDK1.8新特性,default默认方法可以有具体的实现:

//定义函数式接口
interface mylike{
        void lambda();
        default void test2() {
            System.out.println("我是default默认方法可以有具体的实现");
        }
    }

Lambda表达式的推导

定义函数式接口:

package Lambda;

public interface fun_interface {
    void show();
}

匿名函数的语法:

new 接口/类名(参数1, 参数2...){
        实现方法1(){

        }
        实现方法2(){

        }
        ......
 };

匿名函数的方法是:返回值 方法名 参数列表 方法体,我们只需要关心参数列表 方法体,而不用关心方法名和返回值

使用匿名内部类实现该函数式接口:

package Lambda;

public class fun_test1 {
    public static void main(String[] args) {
        fun_interface fun_interface=new fun_interface()
        {
                @Override
                public void show() {
                    System.out.println("重写函数式接口中的方法");
                }
            };
        fun_interface.show();
    }
}

在上述代码中,我们没有创建实现类[fun_test1]的实例化对象就实现了具体的show()方法,通常,我们也习惯用匿名内部类的方式创建并启动线程

但是上面的代码还是略显麻烦

Lambda表达式的写法:

package Lambda;
public class lambda_test {
    public static void main(String[] args) {
        fun_interface fun_interface=()->System.out.println("重写函数式接口中的方法");
        fun_interface.show();
    }
}

无论是匿名内部类还是Lambda表达式都可以正确实现这个接口,但使用匿名内部类,我们会发现在代码量上减少了许多,但其实Lambda表达式的本质就是一个匿名内部类

使用Lambda表达式的前提是:接口为函数式接口

函数式接口的不同类型

package Lambda;

public class fun_test3 {
    //无返回值无参数
    interface NoParameterNoReturn {
        void test();
    }
    //无返回值一个参数
    interface OneParameterNoReturn {
        void test(int a);
    }
    //无返回值多个参数
    interface MoreParameterNoReturn {
        void test(int a,int b);
    }
    //有返回值无参数
    interface NoParameterReturn {
        int test();
    }
    //有返回值一个参数
    interface OneParameterReturn {
        int test(int a);
    }
    //有返回值多参数
    interface MoreParameterReturn {
        int test(int a,int b);
    }

​​​​​​​}

Lambda表达式与函数式接口的简单应用

package Lambda;

public class fun_lambda {
    public static void main(String[] args) {
        //无返回值无参数
        NoParameterNoReturn parameterNoReturn=()-> System.out.println("这里是重写后的方法");
        parameterNoReturn.test();

        //无返回值一个参数
        //写法1
        OneParameterNoReturn oneParameterNoReturn=(a)->{System.out.println(a);};
        oneParameterNoReturn.test(99);
        //写法2
        OneParameterNoReturn oneParameterNoReturn1=a->System.out.println(a);
        //只有一个参数,小括号可以省略;只有一条语句,花括号可以省略
        oneParameterNoReturn1.test(99);

        //无返回值多个参数
        MoreParameterNoReturn moreParameterNoReturn=(a,b)->{System.out.println(a+b);};
        moreParameterNoReturn.test(99,1);

        //有返回值无参数
        NoParameterReturn noParameterReturn=()->{return  520;};
        int ret=noParameterReturn.test();
        System.out.println(ret);

        //有返回值一个参数
        OneParameterReturn oneParameterReturn=(a)->{return a+1;};
        int ret1=oneParameterReturn.test(99);
        System.out.println(ret1);

        //有返回值多参数
        MoreParameterReturn moreParameterReturn=(a,b)->a*b;//相当于(a+b)->{return a*b;}
        int ret2=moreParameterReturn.test(4,8);
        System.out.println(ret2);
    }
}
interface NoParameterNoReturn {
    void test();
}
//无返回值一个参数
interface OneParameterNoReturn {
    void test(int a);
}
//无返回值多个参数
interface MoreParameterNoReturn {
    void test(int a,int b);
}
//有返回值无参数
interface NoParameterReturn {
    int test();
}
//有返回值一个参数
interface OneParameterReturn {
    int test(int a);
}
//有返回值多参数
interface MoreParameterReturn {
    int test(int a,int b);
}

输出:

这里是重写后的方法
99
99
100
520
100
32

注:

参数类型可以省略,如果需要省略,每个参数的类型都要省略。

参数的小括号里面只有一个参数,那么小括号可以省略

如果方法体当中只有一句代码,那么大括号可以省略

如果方法体中只有一条语句,其是return语句,那么大括号可以省略,且去掉return关键字

Lambda表达式的优缺点

优点:

  • 在代码层次上来说,使代码变得非常的简洁,开发迅速
  • 方便函数式编程
  • 非常容易进行并行计算
  • Java 引入 Lambda,改善了集合操作

缺点:

  • 代码可读性变差
  • 在非并行计算中,很多计算未必有传统的 for 性能要高
  • 不容易进行调

以上就是Java学习之Lambda表达式的使用详解的详细内容,更多关于Java Lambda表达式的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java使用lambda表达式简化代码的示例详解

    目录 目的 推理一下 实现接口,使用方法 内部类实现接口,使用方法 局部内部类实现接口,使用方法 匿名内部类实现接口,使用方法 使用lamda表达式的,实现方法 可带参数 只有一个参数 有返回值 只有一条语句 究极省略,不能再省了 lamda总结 代码,自然写的越简洁越好啦,写的人舒服,看的人也舒服,一切为了高效. 要把有限的时间花到其它有意思的事情上去. 目的 学习简化代码的思路,使用jdk8新特性lamada表达式. 推理一下 某接口,只有一个方法. 比如这个: package java.l

  • Java Lambda表达式与引用类浅析

    Lambda表达式和方法引用是一对孪生兄弟 而引用类方法是Lambda支持的方法引用中的一种 引用类方法其实就是引用类的静态方法 直接上代码 首先 我们要创建一个包 包下创建一个接口 我这里叫subInterface 参考代码如下 public interface subInterface { int convelutl(String s); } 可以看到 我们在接口中定义了一个抽象方法 这个方法 接收一个字符串类型的参数 然后返回一个数字类型的值 然后在这个包下创建一个测试类 text 参考代

  • Java学习之Lambda表达式的使用详解

    目录 Lamda表达式 函数式接口 Lambda表达式的推导 函数式接口的不同类型 Lambda表达式与函数式接口的简单应用 Lambda表达式的优缺点 Lamda表达式 λ希腊字母表中排序第11位的字母,英文名称为Lambda,它Lambda表达式是Java SE 8中一个重要的新特性,允许通过表达式来代替功能接口,它与其他方法相同,提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块),实际上是属于函数式编程的概念: 语法如下: (参数) ->表达式 或

  • C++学习之Lambda表达式的用法详解

    目录 简介 捕获 原理 Lambda回调 简介 Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数.Lambda表达式可以表示闭包(注意和数学传统意义上的不同). 闭包就是能够读取其他函数内部变量的函数,可以理解成“定义在一个函数内部的函数“.在本质上,闭包是将函数内部和函数外部连接起来的桥梁. C++中的Lambda表达式

  • Java中Lambda表达式的使用详解

    目录 理解函数式接口以及 Lambda表达式的发展过程 Lambda表达式及语法 一起来看看具体的使用 你需要注意什么 Lambda的实际运用 1.对集合排序 2.遍历集合 3.遍历集合(带条件) 4.代替 Runnable,开启一个线程 理解函数式接口以及 Lambda表达式的发展过程 任何接口,只包含唯一一个抽象方法,就是函数式接口 /** * lambdab表达式的发展 */ public class TestLambda1 { //3.静态内部类 static class Like2 i

  • Java8如何使用Lambda表达式简化代码详解

    系统环境: Java JDK 版本:1.8 参考地址: Java 8 Lambda 表达式 Jdk 8 新特性 04 方法引用与构造器引用 Java 8 新特性:Lambda 表达式之方法引用 一.Lambda 表达式简介 1.什么是 Lambda 表达式 Lambda 表达式是在 JDK 8 中引入的一个新特性,可用于取代大部分的匿名内部类.使用 Lambda 表达式可以完成用少量的代码实现复杂的功能,极大的简化代码代码量和代码结构.同时,JDK 中也增加了大量的内置函数式接口供我们使用,使得

  • Java中的反射,枚举及lambda表达式的使用详解

    目录 一.反射 1.1定义 1.2用途 1.3反射基本信息 1.4与反射相关的类 1.5Class类(反射机制的起源) 1.6Class类中的相关方法 1.7获得Class对象的三种方式 1.8反射的使用 1.9反射优点和缺点 二.枚举 2.1Enum类的常用方法 2.2枚举的优点和缺点 三.Lambda表达式 3.1Lambda表达式的语法及基本使用 3.2函数式接口 3.3变量捕获 总结 一.反射 1.1 定义 Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够

  • Kotlin基础学习之lambda中return语句详解

    前言 当我们爱上lambda并且大范围使用它的时候,我想大家都会被lambda中的return语句狠狠地调戏过,所以今天我们需要一起来揭开lambda中return的神秘面纱. 首先来看一个例子: fun demo() { val indexes = arrayOf(1, 2, 3, 4, 5, 6, 7) indexes.forEach { if (it > 5) { return } println(it) } println("End") } 按照我们的预期,调用demo后

  • 详解Java中的Lambda表达式

    简介 Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块). Lambda表达式还增强了集合库. Java SE 8添加了2个对集合数据进行批量操作的包: java.util.function 包以及java.util.stream 包. 流(stream)就如同迭代器(iterator),但附加了许多额外的功能.

  • 关于Java 中的 Lambda 表达式

    这篇文章我们将讨论关于Java 中的 Lambda 表达式,Lambda 表达式是 Java 涉足函数式编程的过程.它接受参数并将其应用于表达式或代码块.以下是语法的基本示例: (parameter1, parameter2) => expression 或者 (parameter1, parameter2) => {code block} Lambda 表达式非常有限,如果它不是 void,则必须立即返回一个值.他们不能使用诸如 if 或 for 之类的关键字来保持简单性.如果需要更多行代码

  • java并发学习之BlockingQueue实现生产者消费者详解

    1.介绍 阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满:从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空.并发包下很多高级同步类的实现都是基于BlockingQueue实现的. JDK7提供了以下7个阻塞队列: ArrayBlockingQueue :由数组结构组成的有界阻塞队列. LinkedBloc

  • Java中使用Lambda表达式和函数编程示例

    目录 1.简单介绍 2.Lambdas和Scopes 3.Lambdas与局部变量 4.Lambda体与局部变量 5.Lambdas和'This'和'Super'关键字 6.Lambdas和Exceptions 7.预定义的功能接口 1.简单介绍 第一个示例演示变量声明上下文中的lambda.它将lambda()->{System.out.println("running"):}分配给可运行接口类型的变量r. 第二个示例类似,但演示了赋值上下文中的lambda(到先前声明的变量r

随机推荐