java8 ie_Java8语法糖之Lambda表达式_Hudie.的博客-CSDN博客

原文作者:编程一只蝶

原文标题:Java8语法糖之Lambda表达式

发布时间:2021-02-16 13:08:40

一、Lambda表达式简介

Lambda表达式,是Java8的一个新特性,也是Java8中最值得学习的新特性之一。(另一个新特性是流式编程。)

Lambda表达式,从本质上讲是一个匿名方法。可以使用这个匿名方法,实现接口中的方法。

功能:通常使用Lambda表达式,是为了简化接口实现的。关于接口实现可以有多种方式实现,例如:①设计接口的实现类、②使用匿名内部类。但是③使用lambda表达式,比这两种方式都简单。

要求:lambda表达式,只能实现函数式接口:即一个接口中,要求实现类必须实现的抽象方法,有且只有一个。

@FunctionalInterface注解 ,用在接口之前,用来判断接口是否是一个函数式接口。如果不是函数式接口会报错。功能类似于@Override。

二、Lambda表达式语法

lambda表达式本质上是一个匿名方法,因此再写lambda表达式时,不需要关心方法名是什么,也不需要关心返回值类型。只需要关心两部分:参数列表、方法体。

()参数部分:方法的参数列表,要求和实现的接口中的方法参数部分一致,包括参数的数量和类型。

{}方法体部分:方法的实现部分,如果接口中定义的方法有返回值,则在实现时,注意返回值的返回。

-> :分隔参数部分和方法体部分。

Lambda表达式基础语法:

(参数) ->{

方法体

}

下面定义6种参数和返回值各不相同的函数式接口,分别使用lambda表达式对接口中的方法进行实现:

d0ed203d686e72f003243d03b5f9b354.gif

下面是针对上面6种函数式接口的lambda表达式实现。

/**

* @Description:

* @author Guoqianliang

* @date 19:50 - 2021/2/15

*/

public class BasicSyntax {

public static void main(String[] args) {

// 1.实现无参数,无返回值的函数式接口

NoneReturnNoneParameter lambda1 = () -> {

System.out.println("这是无参,无返回值的方法");

};

lambda1.test();

// 2.实现一个参数,无返回值的函数式接口

NoneReturnSingleParameter lambda2 = (int a) -> {

System.out.println("这是一个参数,无返回值的方法,参数a:" + a);

};

lambda2.test(10);

// 3.实现多个参数,无返回值的函数式接口

NoneReturnMutipleParameter lambda3 = (int a, int b) -> {

System.out.println("这是多个参数,无返回值的方法,参数a=" + a + ",b=" + b);

};

lambda3.test(10, 20);

// 4.实现无参数,有返回值有返回值的函数式接口

SingleReturnNoneParameter lambda4 = () -> {

System.out.println("这是无参数,有返回值的方法,返回值是:");

return 10;

};

System.out.println(lambda4.test());

// 5.实现一个参数,有返回值的函数式接口

SingleReturnSingleParameter lambda5 = (int a) -> {

System.out.println("这是一个参数,有返回值的方法,返回值是:");

return a;

};

System.out.println(lambda5.test(10));

// 6.实现多个参数,有返回值的函数式接口

SingleReturnMutipleParameter lambda6 = (int a, int b) -> {

System.out.println("这是多个参数,有返回值的方法,返回值是:");

return a + b;

};

System.out.println(lambda6.test(1, 2));

}

}

语法精简进阶:

参数列表的参数类型可以省略。

如果参数列表中的参数有且只有一个,可以省略小括号。

如果方法体中只有一条语句,可以省略大括号。(注:如果这条语句是返回语句,省略了大括号后也要把return关键字省略)

三、函数引用

lambda表达式是为了简化接口。在lambda表达式中,不应该出现比较复杂的逻辑。如果需要处理的逻辑比较复杂,一般情况会单独写一个方法。在lambda表达式中直接引用这个方法即可。即引用一个已经存在的方法,使其代替lambda表达式完成接口的实现。

1.静态方法引用

语法:类::静态方法

在引用的方法后面,不要添加小括号。

引用的这个方法,参数(数量、类型)和返回值,必须要跟接口中定义的一致。

/**

* @Description: 方法引用

* @author Guoqianliang

* @date 0:26 - 2021/2/16

*/

public class Lambda1 {

private static interface Calculate {

int calculate(int a, int b);

}

private static int calculate(int x, int y) {

if (x > y) {

return x - y;

} else if (x < y) {

return y - x;

}

return x + y;

}

public static void main(String[] args) {

// 静态方法引用

Calculate calculate = Lambda1::calculate;

System.out.println(calculate.calculate(10, 20));

}

}

2.非静态方法引用

语法:对象::非静态方法

在引用的方法后面,不要添加小括号。

引用的这个方法,参数(数量、类型)和返回值,必须要跟接口中定义的一致。

/**

* @Description: 方法引用

* @author Guoqianliang

* @date 0:26 - 2021/2/16

*/

public class Lambda1 {

private static interface Calculate {

int calculate(int a, int b);

}

// 非静态方法

private int calculate2(int a, int b) {

if (a != b) {

return a - b;

}

return a + b;

}

public static void main(String[] args) {

// 非静态方法引用

Calculate calculate2 = new Lambda1()::calculate2;

System.out.println(calculate.calculate(10, 20));

}

}

3.构造方法引用

语法:类名::new

可以通过接口中的方法的参数,区分引用不同的构造方法。

如果某一个函数式接口中定义的方法,仅仅是为了得到一个类的对象。此时就可以使用构造方法的引用,简化这个方法的实现。

/**

* @Description: 构造方法引用

* @author Guoqianliang

* @date 11:20 - 2021/2/16

*/

public class Lambda2 {

@FunctionalInterface

private interface GetPersonWithNoneParameter {

Person get();

}

@FunctionalInterface

private interface GetPersonWithSingleParameter {

Person get(String name);

}

@FunctionalInterface

private interface GetPersonWithMutipleParameter {

Person get(String name, int age);

}

private static class Person {

String name;

int age;

public Person() {

System.out.println("Person类的无参构造方法执行了");

}

public Person(String name) {

this.name = name;

System.out.println("Person类的有参构造方法执行了");

}

public Person(String name, int age) {

this.name = name;

this.age = age;

System.out.println("Person类的两个参数的构造方法执行了");

}

}

public static void main(String[] args) {

// 1.使用lambda表达式,实现GetPersonWithNoneParameter接口

GetPersonWithNoneParameter getPerson = Person::new;

// 2.使用lambda表达式,实现GetPersonWithSingleParameter接口

GetPersonWithSingleParameter getPerson2 = Person::new;

// 3.使用lambda表达式,实现GetPersonWithMutipleParameter接口

GetPersonWithMutipleParameter getPerson3 = Person::new;

System.out.println(getPerson.get());

System.out.println(getPerson2.get("树先生"));

System.out.println(getPerson3.get("你好", 23));

}

}

4.对象方法的特殊引用

使用lambda表达式实现某些接口时,如果lambda表达式中包含了某一个对象,此时方法体中,直接使用这个对象调用它的某一个方法就可以完成整体的逻辑。

/**

* @Description: 对象方法的特殊应用

* @author Guoqianliang

* @date 11:54 - 2021/2/16

*/

public class Lambda3 {

@FunctionalInterface

private interface MyInterface {

// String get(Person person);

void set(Person person, String name);

}

private static class Person {

private String name;

public void setName(String name) {

this.name = name;

}

public String getName() {

return name;

}

}

public static void main(String[] args) {

Person p1 = new Person();

p1.setName("小明");

// 逻辑实现只是为了获取到对象的名字

// MyInterface lambda2 = Person::getName;

// System.out.println(lambda2.get(p1));

// 逻辑实现只是为了给对象的某些属性进行赋值

MyInterface lambda1 = (x, n) -> x.setName(n);

MyInterface lambda2 = Person::setName;

lambda2.set(p1, "李华");

System.out.println(p1.getName());

}

}

四、Lambda表达式需要注意的问题

如果用到局部变量,默认会被声明为常量,不能发生值的改变。

/**

* @Description:

* @author Guoqianliang

* @date 13:05 - 2021/2/16

*/

public class Lambda4 {

public static void main(String[] args) {

// 1.定义一个局部变量

int x = 10;

// 2.使用lambda表达式实现接口

LambdaTest lambda = () -> {

System.out.println("x=" + x);

};

// 3. 无法修改常量x

// x=20;

}

}

@FunctionalInterface

interface LambdaTest {

void test();

}

Post Views:

9

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中的event_Python event

最新项目游戏感用于SteelSeries GameSense 3.8.x的Python库安装这个包有两个不同的版本。一个支持普通的同步函数调用&#xff0c;另一个支持python的异步功能。要安装同步版本&#xff0c;请运 ...2021-03-02已阅读: n次此模块验证事件模块中的电话号码&#xff0c;就像base_p…

centos的mysql怎么删用户_linux/centos给Mysql创建用户、授权、查看、删除、修改密码、撤...

linux/centos给Mysql创建用户、授权、查看、删除、修改密码、撤linux/centos给Mysql创建用户、授权、查看、删除、修改密码、撤销权限linux/centos给Mysql创建用户、授权、查看、删除、修改密码、撤销权限root权限高&#xff0c;安全性考虑&#xff0c;一般只允许本地(本机)访问…

采取 过滤 php_这3种php高级过滤了解一下,很实用!

在php中有很多的过滤&#xff0c;可以对输入的字符串进行过滤&#xff0c;同时也可以对邮件地址进行过滤&#xff0c;接下来我要讲的是php中的3种高级过滤&#xff0c;在开发中很实用。第一种&#xff1a;过滤数值范围在php经常要接收各种数据&#xff0c;其中数值是非常普遍的…

吃PHP小孩智力好,这7种鱼千万不能给孩子吃,会影响孩子的智力!

所以&#xff0c;给宝宝添加鱼类时一定要注意&#xff0c;有7种鱼含有大量金属元素&#xff0c;是千万不能给宝宝吃的&#xff01;1罗非鱼罗非鱼深青色的外表有几分像鲫鱼。由于罗非鱼的成长周期较长&#xff0c;它们体内汞的含量也就相比其他鱼偏高&#xff0c;小朋友吃罗非鱼…

java监控rabbitMq服务状态,spring cloud 的监控turbine-rabbitmq的示例

前提是你已经有了注册中心,然后搭建一个基础spring cloud 服务,并配置注册服务等等前提环境搭建接下来描述的服务提供者和服务调用者的配置都是一样的,来自《spring cloud 与 docker微服务架构实战》的读后的个人总结.pom文件中需要引入spring-cloud-starter-hystrix/spring-cl…

java弹球轨迹运动解说,动态弹球的实现 加入了多线程技术-javaSE游戏准备工作

动态弹球的实现 加入了多线程技术--javaSE游戏准备工作任务描述:实现了动态弹球的功能&#xff0c;对于有弹球功能的SE游戏奠定了基础。package 运用线程技术的小球;import java.awt.*;import java.awt.event.*;import java.awt.geom.*;//不清楚这个有什么用import java.util.*…

asp php 用户登录,一个简单的asp.net 单点登录实现

以下是实现的效果图&#xff1a;首先上图的点击火车订票链接&#xff0c;就会打开http://学生信息平台网站/LoginToTrainSite.asa页面。LoginToTrainSite.asa页面的大致代码如下&#xff1a;Response.Buffer TrueResponse.ExpiresAbsolute Now() - 1Response.Expires 0Respo…

ajax怎么发送数据给php,ajax怎么发送数据给php

在网上看了很久&#xff0c;发现数据的利用ajax提交数据到后台其实很简单&#xff0c;但是很多讲解的并不清楚&#xff0c;对于初学者来说&#xff0c;很多真的是看着有点糊涂&#xff0c;拿来直接用&#xff0c;又想去了解怎么回事&#xff0c;其实利用ajax提交数据到后台是非…

oracle10无法安装打开,64位win10添加oracle odbc驱动时提示无法加载oracle怎么办

对于win10 64位系统添加oracle odbc驱动时提示无法加载oracle的问题相信部分用户都应该有所了解了&#xff0c;但是对于如何解决这个问题的实际操作的用户来说可能不多&#xff0c;因此&#xff0c;为了帮助出现这种问题的用户&#xff0c;小编在这里就来教大家64位win10添加or…

linux postgresql默认安装目录,postgresql - 三种安装方式(示例代码)

最近接触了postgresql的安装&#xff0c;和大家分享一下。一、简 介PostgreSQL 是一种非常复杂的对象-关系型数据库管理系统(ORDBMS)&#xff0c;也是目前功能最强大&#xff0c;特性最丰富和最复杂的自由软件数据库系统。有些特性甚至连商业数据库都不具备。这个起源于伯克利(…

linux中央服务器,如何在Linux上搭建一个Git中央仓库

前言&#xff1a;本教程只面向那些个人开发者&#xff0c;想要自己在linux上搭建一个git中央仓库用来上传发布自己的项目。但是对于团队来说可能有更高的要求&#xff0c;可以使用gitlab搭建一个可视化的类似github的版本管理系统测试环境我使用的linux版本是Centos7&#xff0…

linux桌面发展方向,观点|Linux 桌面的发展之路!

Ken Starks 在 fossforce.com 网站上问 你们是如何优化 Linux 的&#xff1f;&#xff0c;我很高兴他问了这个问题&#xff0c;因为我有话要说&#xff01;对我来说&#xff0c;Linux 桌面就是一连串的承诺&#xff0c;但是这些承诺却总是无法兑现。它在每个版本发布后都会说“…

linux常见基础服务,常用的linux命令的基本使用(一)

序号命令对应英文作用01lslist查看当前文件夹下的内容02pwdprint name of of current/working directory查看当前所在文件夹03cd[目录名]change directory切换文件夹04touch[目录名]touch如果文件不存在&#xff0c;新建文件05mkdir[目录名]make directory创建目录06rm[文件名]…

树莓派怎么学linux,树莓派使用入门用树莓派学 Linux

树莓派使用入门用树莓派学 Linux我们的《树莓派使用入门》的第四篇文章将进入到 Linux 命令行。在本系列的 第三篇文章 中开始了我们的树莓派探索之旅&#xff0c;我分享了如何安装 Raspbian&#xff0c;它是树莓派的官方 Linux 版本。现在&#xff0c;你已经安装好了 Raspbian…

全国计算机二级C语言过关要求,计算机二级考试c语言过关经验

计算机二级考试c语言过关经验考试要求考生在规定的时间内按指定的方式解答精心选定的题目或按主办方的要求完成一定的实际操作的任务&#xff0c;并由主办方评定其结果&#xff0c;从而为主办方提供考生某方面的知识或技能状况的信息。下面是小编整理的关于计算机二级考试c语言…

c语言链表贪吃蛇脚本之家,C++控制台实现贪吃蛇游戏

本文实例为大家分享了C实现贪吃蛇游戏的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下刚学完了C语言&#xff0c;便尝试的写了贪吃蛇的代码&#xff0c;但是效果不佳&#xff0c;很多的bug&#xff0c;所以&#xff0c;这个学了C&#xff0c;便重新的写了这个小游戏…

win8能开发android的sdk么,Win8下Android SDK安装与环境变量配置教程

Win8下Android SDK的安装与环境变量配置&#xff0c;具体内容如下1、下载Android SDK&#xff0c;点击安装&#xff0c;直接默认路径即可&#xff01;进入该网站后往下拉就能找到sdk下载的位置&#xff0c;选择图中红圈的程序进行下载2、安装过程比较简单&#xff0c;按照平时安…

Android公共jar,使用JitPack管理Android项目中公共模块库

随着项目的功能越来越多&#xff0c;代码和模块维护也越来越复杂&#xff0c;为了减少主项目的代码量&#xff0c;一般都会将一些公共使用的类或者功能模块抽离出来&#xff0c;与主项目解耦分离&#xff0c;当主项目中需要使用的时候&#xff0c;直接进行引用即可。现在Androi…

mac android 手机连接打印机,为什么苹果电脑连接打印机打不出来怎么办

1. 为什么苹果笔记本连接打印机打印不了1、您的 Wi-Fi 或本地网络上的 AirPrint 打印机。2、临近的 Wi-Fi 打印机或位于您本地网络且支持 Bonjour 的基于有线网络的打印机。3、连接到家庭网络中 Time Capsule 或 AirPort 基站的 USB 端口的打印机。4、与家庭网络中的其他 Mac 共…

华为正式官宣鸿蒙OS,华为正式官宣,鸿蒙OS 2.0系统即将问世,Mate 40有望首发

由于华为5G技能取得了突破性的领先&#xff0c;美国对其采取了实体清单操持。意图干涉华为的发展速率&#xff0c;但实际上对于华为影响最大的却是软件方面的“断供”。在美国发布实体清单短短数月之后&#xff0c;谷歌公布停止对于华为手机系统的GMS服务授权。间接导致了华为手…