我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java的Lambda表达式如何使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java的Lambda表达式如何使用

这篇文章主要介绍“Java的Lambda表达式如何使用”,在日常操作中,相信很多人在Java的Lambda表达式如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java的Lambda表达式如何使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Lambda表达式介绍

  • Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。

  • Lambda表达式是Java SE 8中一个重要的新特性。

Lambda与匿名内部类

Lamda表达式指的是应用在SAM(SingleAbstractMethod,含有一个抽象方法的接口)环境下的一种简化定义形式。

Lambda比匿名内部类的优点

简洁(详见下边“函数式接口”)

Lamda相对于匿名内部类的缺点

  • Lamda对应的接口只能有一个方法。

  • 匿名内部类对应的接口可以有多个方法

对接口的要求

Lambda 规定接口中只能有一个需要被实现的方法(即抽象方法)。

在一个接口中,后边几个可同时存在:一个抽象方法(只能有一个)、多个default方法、多个static方法。

// jdk 8 中有另一个新特性:default, 被 default 修饰的方法会有默认实现,不是必须被实现的方法,所以不影响 Lambda 表达式的使用。

@FunctionalInterface:用来修饰函数式接口。

@FunctionalInterface写不写都可以。此注解主要用于编译级错误检查:当接口不符合函数式接口定义的时候,编译器会报错。

正确例子,没有报错:

@FunctionalInterfacepublic interface HelloWorldService {    void sayHello(String msg);}

错误例子,报错:

接口中包含了两个抽象方法,违反了函数式接口的定义,提示在接口中找到多个非重写的抽象方法。 

Java的Lambda表达式如何使用

注意: 加不加 @FunctionalInterface对于接口是不是函数式接口没有影响,该注解只是提醒编译器去检查该接口是否仅包含一个抽象方法。

变量和作用域

  • Lambda 表达式只能引用标记了 final 的外层局部变量。即不能在 lambda 内部修改定义在域外的局部变量,否则编译报错

  • Lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义)

  • Lambda 表达式中不允许声明一个与局部变量同名的参数或者局部变量。

格式

lambda表达式的重要特征

  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。

  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。

  • 可选的大括号:若主体包含了一个语句,就不需要使用大括号。例: () -> Sysout.out.println("Test");

  • 可选的返回关键字:若主体只有一个表达式返回值则编译器会自动返回值,大括号需指定明表达式返回了一个数值。

Lambda 表达式的简单例子 

不需要参数,返回值为 5  

() -> 5  

接收一个参数(数字类型),返回其2倍的值  

x -> 2 * x  

接受2个参数(数字),并返回他们的差值  

(x, y) -> x – y  

接收2个int型整数,返回他们的和  

(int x, int y) -> x + y  

接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  

(String s) -> System.out.print(s)

语法格式

格式:

(parameters) -> statement   或(parameters) ->{ statements; }

左侧:Lambda 表达式的参数列表

右侧:Lambda 表达式中所需要执行的功能 (Lambda体)

语法格式一:无参数,无返回值

() -> Sysout.out.println("Test");

语法格式二:有一个参数,并且无返回值

(X)-> Sysout.out.println(x);

语法格式三:如果有一个参数括号可以不写

X-> Sysout.out.println(x);

语法格式四:有两个以上的参数,有返回值,并且Lambda体中有多条语句,语法体中需要用{}

    Comparator<Integer> comparator = (o1, o2) -> {        System.out.println("Test");        return Integer.compare(o1, o2);    };

语法格式五:Lambda体中只用一条语句,return和{}可以省略不写

Comparator comparator = (o1, o2)->Integer.compare(o1, o2);

语法格式六:表达式的参数列表的数据类型可以省略不写,JVM编译器通过上下文推断出数据类型

(x ,y ) ->Integer.compare(x ,y)

实例

无参数无返回值

package org.example.a; @FunctionalInterfaceinterface Interface {    void run();} public class Demo{    public static void main(String[] args) {        Interface params = new Interface() {            @Override            public void run() {                System.out.println("Anonymous Internal Class: ");            }        };         Interface params1 = () -> System.out.println("Lambda: ");         params.run();        params1.run();    }}

执行结果

Anonymous Internal Class: 
Lambda: 

有参数无返回值

package org.example.a; @FunctionalInterfaceinterface Interface {    void run(String s);} public class Demo{    public static void main(String[] args) {        Interface params = new Interface() {            @Override            public void run(String s) {                System.out.println("Anonymous Internal Class: " + s);            }        };         Interface params1 = (s) -> System.out.println("Lambda: " + s);         params.run("hello");        params1.run("hi");    }}

执行结果

Anonymous Internal Class: hello
Lambda: hi 

有参数有返回值

package org.example.a; @FunctionalInterfaceinterface Interface {    String run(String s);} public class Demo{    public static void main(String[] args) {        Interface params = new Interface() {            @Override            public String run(String s) {                System.out.println("Anonymous Internal Class: " + s);                return "abc";            }        };         Interface params1 = (s) -> {            System.out.println("Lambda: " + s);            return "def";        };         System.out.println(params.run("hello"));        System.out.println(params1.run("hi"));    }}

执行结果

Anonymous Internal Class: hello
abc
Lambda: hi
def 

lambda作为参数

传递一个函数

package org.example.a; interface IRun {    String welcome(String string);} class Util {    public static long executionTime1(IRun iRun, String string) {        long startTime = System.currentTimeMillis();        System.out.println(iRun.welcome(string));        //本处刻意添加这一无意义延时,防止执行太快返回0        try {            Thread.sleep(10);        } catch (Exception e) {            System.out.println(e);        }        long endTime = System.currentTimeMillis();        return endTime - startTime;    }     public long executionTime2(IRun iRun, String string) {        long startTime = System.currentTimeMillis();        System.out.println(iRun.welcome(string));        //本处刻意添加这一无意义延时,防止执行太快返回0        try {            Thread.sleep(10);        } catch (Exception e) {            System.out.println(e);        }        long endTime = System.currentTimeMillis();        return endTime - startTime;    }     public static String hello(String string){        String tmp;        tmp = "hello: " + string;        return tmp;    }     public String hi(String string){        String tmp;        tmp = "hi: " + string;        return tmp;    }} public class Demo {    public static void main(String[] args) {        long time1 = Util.executionTime1(Util::hello, "Tony");        long time2 = new Util().executionTime2(new Util()::hi, "Pepper");        System.out.println("time1: " + time1 + "ms");        System.out.println("time2: " + time2 + "ms");    }}

执行结果

hello: Tony
hi: Pepper
time1: 11ms
time2: 11ms

直接传递lambda函数 

package org.example.a; interface IRun {    String welcome(String string);} class Util {    public static long executionTime(IRun iRun, String string) {        long startTime = System.currentTimeMillis();        System.out.println(iRun.welcome(string));        //本处刻意添加这一无意义延时,防止执行太快返回0        try {            Thread.sleep(10);        } catch (Exception e) {            System.out.println(e);        }        long endTime = System.currentTimeMillis();        return endTime - startTime;    }} public class Demo {    public static void main(String[] args) {        long time = Util.executionTime((string -> {                    String tmp;                    tmp = "hello: " + string;                    return tmp;                })                , "Tony");        System.out.println("time: " + time + "ms");    }}

执行结果

hello: Tony
time: 11ms

遍历集合

package org.example.a; import java.util.ArrayList;import java.util.List; public class Demo{    public static void main(String[] args) {        List<String> list = new ArrayList<>();        list.add("aaa");        list.add("bbb");         //以前的循环方式        for (String string : list) {            System.out.println(string);        }         //使用lambda表达式输出list中的每个值        list.forEach(c->{            System.out.println(c);        });         // 在 Java 8 中使用双冒号操作符(double colon operator)。也属于lamda表达式        list.forEach(System.out::println);    }}

执行结果

aaa
bbb
aaa
bbb
aaa
bbb

创建线程

package org.example.a; public class Demo{    public static void main(String[] args) {        new Thread(new Runnable() {            @Override            public void run() {                System.out.println("Anonymous Internal Class !");            }        }).start();         new Thread(() -> System.out.println("Lambda !")).start();    }}

执行结果

Anonymous Internal Class !
Lambda !

排序

package org.example.a; import java.util.Arrays;import java.util.Comparator; public class Demo{    public static void main(String[] args) {        String[] players = {"Rafael Nadal", "Novak Djokovic", "Stanislas Wawrinka"};                Arrays.sort(players, new Comparator<String>() {            @Override            public int compare(String o1, String o2) {                return (o1.compareTo(o2));            }        }); //        Comparator<String> sortByName = (String s1, String s2) -> (s1.compareTo(s2));//        Arrays.sort(players, sortByName);        //        Arrays.sort(players, (String s1, String s2) -> (s1.compareTo(s2)));                for(String string:players){            System.out.println(string);        }    }}

执行结果(换成注释掉的两种任意一种都是一样的)

Novak Djokovic
Rafael Nadal
Stanislas Wawrinka

到此,关于“Java的Lambda表达式如何使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java的Lambda表达式如何使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java的Lambda表达式如何使用

这篇文章主要介绍“Java的Lambda表达式如何使用”,在日常操作中,相信很多人在Java的Lambda表达式如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java的Lambda表达式如何使用”的疑
2023-06-30

lambda表达式如何在java中使用

这篇文章给大家介绍lambda表达式如何在java中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Lamda表达式λ 希腊字母表中排序第十一位字母,英语名称为Lambda避免匿名内部类定义过多其实质属于函数式 编程
2023-06-14

python如何使用Lambda表达式

这篇文章主要为大家展示了“python如何使用Lambda表达式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python如何使用Lambda表达式”这篇文章吧。Lambda表达式厌倦了定义用不
2023-06-27

java lambda表达式怎么使用

Java lambda表达式是Java 8引入的一种新特性,它可以简化代码的编写,尤其是在处理函数式接口时非常方便。下面是使用lambda表达式的一些常用方法:1. 使用匿名内部类的方式创建函数式接口的实例:```MyInterface m
2023-09-23

Java Lambda表达式怎么使用

这篇文章主要介绍“Java Lambda表达式怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java Lambda表达式怎么使用”文章能帮助大家解决问题。一、背景Lambda表达式是Java
2023-06-29

如何在Java项目中使用lambda表达式

这期内容当中小编将会给大家带来有关如何在Java项目中使用lambda表达式,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java8引入了lambda表达式。lambda表达式并不是新功能,只是为了方便代
2023-05-31

C++ 中如何使用lambda表达式?

lambda 表达式是 c++++ 中的匿名函数,用于创建一次性的函数。它们通过捕获列表访问外部作用域变量,并可以接收参数和定义返回类型。lambda 表达式通常用于快速创建或在运行时传递函数。它们可以访问 lvalue 和 rvalue,
C++ 中如何使用lambda表达式?
2024-04-12

C#中如何使用Lambda表达式

本篇文章为大家展示了C#中如何使用Lambda表达式,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C# Lambda表达式我们从“所有字符串查找包含YJingLee子字符串”说起。在C# 2.0中,
2023-06-17

C#中Lambda表达式如何使用

本篇内容介绍了“C#中Lambda表达式如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、介绍1、"Lambda表达式"是一个特殊的
2023-06-30

如何理解Java中的lambda表达式

这篇文章主要介绍了如何理解Java中的lambda表达式的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何理解Java中的lambda表达式文章都会有所收获,下面我们一起来看看吧。Lambda概述Lambda表
2023-06-30

C++11中lambda表达式如何使用

本篇文章为大家展示了C++11中lambda表达式如何使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。首先这个lambda就是罗马字母λ,lambda表达式即λ表达式。数学上有一个概念叫λ演算,其
2023-06-19

Lambda表达式如何在Android 中使用

这篇文章给大家介绍Lambda表达式如何在Android 中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.Lambda表达式的基本写法如果想要在 Android 项目中使用 Lambda表达式 或者 Java8
2023-05-31

如何在Java8中使用lambda表达式

这篇文章给大家介绍如何在Java8中使用lambda表达式,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 0. 函数式编程 函数式编程(Functional Programming)属于编程范式(Programm
2023-06-14

lambda表达式如何在JAVA8中使用

这期内容当中小编将会给大家带来有关lambda表达式如何在JAVA8中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一:什么是 Stream?Stream(流)是一个来自数据源的元素队列并支持聚合操作
2023-06-15

Java中Lambda表达式基础及使用

目录一、举例说明1、无参无返回1.1 定义一个接口1.2接口实现类1.3 测试类2、有参无返回代码示例3、有参有返回二、简单事项1、省略模式2、注意事项三、Lambda表达式和匿名内部类的区别1、所需类型不同:2、使用限制不同:3、实现原理不同:标准格式:三要
2019-12-07

Java的Lambda表达式使用实例分析

这篇文章主要讲解了“Java的Lambda表达式使用实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java的Lambda表达式使用实例分析”吧!Lambada 简介lambda 表达
2023-07-05

Java中Lambda表达式使用及详解

Java中Lambda表达式使用及详解 前言 一、Lambda表达式的简介 Lambda表达式(闭包):java8的新特性,lambda运行将函数作为一个方法的参数,也就是函数作为参数传递到方法中。使用lambda表达式可以让代码更加
2023-08-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录