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…

hadoop 运行java类_hadoop运行java类

使用hadoop运行自己写的java类报错&#xff1a;/home/hadoop/bin/hadoop MaxTemperature /home/hadoop/input/sample.txt outputException in thread "main" java.lang.NoClassDefFoundError: MaxTemperatureCaused by: java.lang.ClassNotFoundException: MaxTemper…

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;其中数值是非常普遍的…

java打乱一组正序数字,Leetcode︱4.Median of Two Sorted Arrays寻找两个正序数组的中位数.java...

题目给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。示例 &#xff1a;输入&#xff1a;nums1 [1,3], nums2 [2]输出&#xff1a;2.00000解释&#xff1a;合并数组 [1,2,3] &#xff0c;中位数 2说明:nums1.leng…

php中的oop思想,避免OOP的形式,POP的思想_PHP

避免OOP的形式,POP的思想_PHP避免OOP的形式,POP的思想好久没发技术性文章了,今天在21PHP里看到有位兄弟发了这贴子,转了过来.对加强OOP的学习有些用----------------------------------------------------------避免OOP的形式,POP的思想随着PHP对OOP(面向对象编程)支持的增强以…

吃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…

支付宝php40247,支付宝APP支付 显示 系统繁忙 请稍后再试 ALI40247

PHP服务端生成地址传给IOS端调用 一直显示系统繁忙 请稍后再试 ALI40247 密钥也正常 也按照官方说明来走。官方的PHP端SDK是错误的 根本不加密biz_content 字段随后百度找不到相关的资料 只有人说换成 1.0版本 也就是 移动支付移动支付相关文档 https://doc.open.alipay.com…

java jlabel构造方法,浅谈标签和JLabel类构造方法 原创

搜索热词标签有 JLabel 类定义&#xff0c;它的父类为 JComponet 类。标签可以显示一行只读文本、一个图像或带图像的文本。它并不能产生任何类型的事件&#xff0c;只能简单地展示图片和文本&#xff0c;但是可以使用标签的特性指定标签上文本的对齐方式。JLabel类提供了多种构…

php改变iframe的src,js动态改变iframe的src属性

今天在Chrome下显示如下的iframe&#xff0c;src设置为空&#xff0c;但打开页面时iframe一直处于刷新状态&#xff0c;看了下面的博文&#xff0c;觉得是不是默认不显示时src应该写成about:blank&#xff0c;明天回去测试下&#xff0c;回来更新结果写一个&#xff0c;src地址…

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

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

Java语言矩形与立方体的继承,沈阳师范大学大一下册C++语言PTA题目集以及答案(编程题篇)...

沈阳师范大学大一下册C语言PTA题目集以及答案(编程题篇)7-1 测试c (20分)倒序输出从控制台输入的n个整数输入格式:第一行输入一个数n&#xff0c;代表行数依次输入n个整数输出格式:将n个整数倒序输出输入样例:31 2 3输出样例:321#includeint main(){int n,i;std::cin>>i;…

php启动 大量sess文件,关于PHP中Session文件过多的问题

PHP的默认机制&#xff1a;每一次php请求&#xff0c;会有1/100的概率(默认值)触发“session回收”。如果“session回收”发生&#xff0c;那就会检查/tmp/sess_*的文件&#xff0c;如果最后的修改时间到现在超过了1440秒(gc_maxlifetime的值)&#xff0c;就将其删除&#xff0…

MATLAB求图片两圆圆心,求助:如何求此图中两圆的圆心距?

对于你给出的图片&#xff0c;我根据之前提到的思路编写了以下程序。感觉还蛮准的。这个程序只能用于两圆相交的情况。当小圆在大圆内部时&#xff0c;需要在其中加以判定。仅供参考。clear;clcc imread(1.jpg);cc c;tic[m n] size(c);for i1:mindex find(~c(i,:));if leng…

php-fpm 启动拥有者,php-fpm 的各种启动方式

启动 php-fpm 最简单的操作&#xff1a;/usr/local/php/sbin/php-fpmphp 5.3.3 以后的php-fpm 不再支持 php-fpm 以前具有的 /usr/local/php/sbin/php-fpm (start|stop|reload)等命令&#xff0c;所以不要再看这种老掉牙的命令了&#xff0c;需要使用信号控制&#xff1a;maste…

java比较时间的先后utc时间,日期、时间与UTC

传统日期的局限人类在对时间的测定上存在一个进化的过程&#xff0c;最早通过观察天体的自转与公转来确定时间&#xff0c;比如地球自转一周为一天&#xff0c;月球公转一周为一月&#xff0c;地球公转一周为一年。我们先考虑天和年&#xff0c;他们之间就像数学一样存在一个粗…

php主题怎么增加导航页,教你如何给wordpress主题添加导航栏

烈火建站学院转载 不是所有的wordpress主题都自带导航栏的&#xff0c;我早就想自行添加一个。昨天的标题前有“GOOGLE是个好老师”这个句子&#xff0c;今早赶紧删了&#xff0c;倒不是不认同&#xff0c;而是觉得在添加导航栏这个事情上还真不是那么回事情。以前我就说过&…

python 画线条进行到指定区域更改颜色,使用Colormaps在matplotlib中设置线条的颜色...

线条样式&#xff0c;标记和定性颜色的组合&#xff0c;来自matplotlib&#xff1a;import itertoolsimport matplotlib as mplimport matplotlib.pyplot as pltN 8*410l_styles [-,--,-.,:]m_styles [,.,o,^,*]colormap mpl.cm.Dark2.colors # Qualitative colormapfor …

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

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