java核心卷一读书感想_关于JAVA核心技术(卷一)读后的思考(lambda表达式的讨论)...

lambda表达式

lambda表达式是一个可传递的代码块。可以以后执行一次或者多次。在程序运行中我们经常会遇到传递代码段的情况,但是我们一般都是先构造一个对象,然后通过对象调用相应的代码块来实现传递代码块的目的,这个方法十分繁琐,设计师为解决这个问题,就设计出了lambda表达式。

lambda表达式的语法

我们可以参考之前写的方法,可以发现如果方法可以分为方法名,参数和方法主体。lambda表达式就是将方法名省去:

标准情况:

(参数类型1 参数1,参数类型2 参数2,.....,参数类型n 参数n)

—>{方法主体}

lambda表达式就是一个代码块,以及必须传入代码的类型规范。如果表达式只有一句话,可以省去大括号以及return;

(参数类型1 参数1,参数类型2 参数2,.....,参数类型n 参数n)

—>表达式

如果是lambda表达式是无参数的情况时,仍然要提供空括号,就如同无参数方法一样。

()—>{方法主体}

如果可以推导出lambda表达式的参数类型,就可以忽略参数类型。

( 参数1, 参数2,....., 参数n)

—>{方法主体}

如果方法只有一个参数,且这个参数类型是可以推导出来的还可以省略小括号。

参数

—>{方法主体}

在lambda表达式中不需要指定返回类型,其返回类型会在上下文推导出来。

下面的代码实现如何在一个比较器和一个动作监听器中使用lambda表达式。

packagecom.java.lambda;importjava.util.Arrays;importjava.util.Date;importjavax.swing.JOptionPane;importjavax.swing.Timer;public classLambdaTest {public static voidmain(String[] args) {//TODO Auto-generated method stub

String[] planets=new String[] {"Mercury","Venus","Earth","Mars","Jupiter","Saturn","Uranus","Neptune"};

System.out.println(Arrays.toString(planets));

System.out.println("Sorted in dictionary order:");

Arrays.sort(planets);

System.out.println(Arrays.toString(planets));

Arrays.sort(planets, (first,second)->first.length()-second.length());

System.out.println(Arrays.toString(planets));

Timer t=new Timer(1000,event->System.out.println("The time is "+newDate()));

t.start();

JOptionPane.showMessageDialog(null, "Quit Program?");

System.exit(0);

}

}

运行结果如下:

[Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune]

Sorted in dictionary order:

[Earth, Jupiter, Mars, Mercury, Neptune, Saturn, Uranus, Venus]

[Mars, Earth, Venus, Saturn, Uranus, Jupiter, Mercury, Neptune]

The time is Thu Feb07 15:05:03 GMT+08:00 2019The time is Thu Feb07 15:05:04 GMT+08:00 2019The time is Thu Feb07 15:05:05 GMT+08:00 2019The time is Thu Feb07 15:05:06 GMT+08:00 2019The time is Thu Feb07 15:05:07 GMT+08:00 2019The time is Thu Feb07 15:05:08 GMT+08:00 2019The time is Thu Feb07 15:05:09 GMT+08:00 2019

通过分析可以发现,lambda在代码中起到的作用就是直接使用代码块的功能。

函数式接口

Java中已经有很多封装代码块的接口,lambda表达式与这些接口是兼容的。对于只有一个抽象方法的接口,需要这种接口的对象时,就可以提供一个lambda表达式。这种接口称为函数式接口。

可以这么理解,如果有一个接口A是只有一个抽象方法的接口,在某个类引用了这个接口,调用这个方法时,那个方法就会执行lambda这个表达式的体。这样会使代码更加简洁。

方法引用

方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。计算时,方法引用会创建函数式接口的一个实例。简单地说,就是一个Lambda表达式。在Java 8中,我们会使用Lambda表达式创建匿名方法,但是有时候,我们的Lambda表达式可能仅仅调用一个已存在的方法,而不做任何其它事,对于这种情况,通过一个方法名字来引用这个已存在的方法会更加清晰,Java 8的方法引用允许我们这样做。方法引用是一个更加紧凑,易读的Lambda表达式,注意方法引用是一个Lambda表达式,其中方法引用的操作符是双冒号"::"。

主要分为三种情况:

1)object::instanceMethod

2)  Class::staticMethod

3)  Class::instanceMethod

构造器引用

构造器引用与方法引用很类似,只不过方法名为new。例如,Person::new是Person构造器的一个引用,但是我们这个是并不知道哪一个构造器的,这是要根据上下文才能决定的。

可以用数组类型建立构造器引用,例如int[]::new即等价于x->new int[x];

其实还有一些关于关于lambda的知识,那些我并未完全读懂,等我研究透了,会在这篇博客中加上。

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

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

相关文章

POJ 2773 欧几里得

思路&#xff1a; 若a和b互素的话&#xff0c;则b*ta和b一定互素 用周期性做就好了 //By SiriusRen #include <cstdio> using namespace std; int s[1000050],m,k; int gcd(int a,int b){return b?gcd(b,a%b):a;} int main(){while(~scanf("%d%d",&m,&…

python语言包括哪些实现_Python语言基础考察点:python语言基础常见考题(一)

一、python是静态还是动态类型&#xff1f;是强类型还是弱类型&#xff1f; 1、动态强类型语言(不少人误以为是弱类型) 不要傻傻分不清 2、动态还是静态指的是编译期还是运行期确定类型 3、强类型指的是不会发生隐式类型转换 若类型语言强类型语言4、python作为后端语言优缺点 …

全国计算机等级考试题库二级C操作题100套(第42套)

第42套&#xff1a; 给定程序中&#xff0c;函数fun的功能是: 将s所指字符串中的所有数字字符移到所有非数字字符之后&#xff0c;并保持数字字符串和非数字字符串原有的先后次序。例如&#xff0c;形参s所指的字符串为&#xff1a;def35adh3kjsdf7。执行结果为&#xff1a;de…

不同的编译器:GCC G++ C C++的区别

gcc 是c的编译器&#xff0c;g是c的编译器。cc一般是一个符号连接&#xff0c;指向gcc。CC一般是makefile里面的一个名字&#xff0c;具体是什么根据实际情况决定。gcc和g都是GNU(组织)的一个编译器。误区一:gcc只能编译c代码,g只能编译c代码两者都可以&#xff0c;但是请注意&…

python 3.8.0安卓_Python 3.8.0稳定版正式发布

IT之家 10月15日消息 Python是一种面向对象的动态类型语言&#xff0c;最初被设计用于编写自动化脚本&#xff0c;随着版本的不断更新和语言新功能的添加&#xff0c;越来越多被用于独立的、大型项目的开发。Python 3.8.0稳定版现已正式发布&#xff0c;带来了许多新特性和优化…

全国计算机等级考试题库二级C操作题100套(第43套)

第43套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;在形参ss所指字符串数组中查找与形参t所指字符串相同的串&#xff0c;找到后返回该串在字符串数组中的位置&#xff08;下标值&#xff09;&#xff0c;未找到则返回-1。ss所指字符串数组中共有N个内容不…

网站开发中JS中的常用语句

1.document.write( " "); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document- >html- >(head,body) 4.一个浏览器窗口中的DOM顺序是:window- >(navigator,screen,history,location,document) 5.得到表单中元素的名称和值:document.getElement…

由于开发者通过接口修改了菜单配置_开发者说:Seata 0.7.0 版本,你 get 'Metrics' 技能了吗?...

从用户的视角来感受一个开源项目的成长&#xff0c;是我们推出「开发者说」专栏的初衷&#xff0c;即在开发者进行开源项目选型时&#xff0c;提供更为立体的项目信息。专栏所有内容均来自作者原创/投稿&#xff0c;本文是「开发者说」的第9篇&#xff0c;作者郑扬勇&#xff0…

BZOJ1045 HAOI2008糖果传递(贪心)

显然最后每个小朋友所拥有的糖果数就是糖果数总和的平均数。设该平均数为t。 环的问题一般断成链&#xff0c;但这个题似乎没有什么很好的办法在枚举断点的时候快速算出答案&#xff08;我甚至不知道会不会有断点&#xff09; 于是我们假装把他断开了。假装现在我们已经知道了1…

java中的 请求体_在spring mvc test中访问请求体和请求头

我创建了一个spring boot应用程序&#xff0c;这就是我的控制器的样子 . 我使用postman在请求体中发送json&#xff0c;在请求头中发送一个字符串&#xff0c;然后进一步散列json并将其与请求头获取的字符串进行比较 . 问题是我不知道获取请求体和请求头以便使用MockMvc测试相应…

Java 多线程(三) 线程的生命周期及优先级

Java 多线程&#xff08;三&#xff09; 线程的生命周期及优先级 线程的生命周期 线程的生命周期&#xff1a;一个线程从创建到消亡的过程。 如下图&#xff0c;表示线程生命周期中的各个状态&#xff1a; 线程的生命周期可以分为四个状态&#xff1a; 1.创建状态&#xff1a; …

eclipse 导入maven项目_手把手的Spring Boot Web 项目教程,Hello Spring Boot

在开始之前&#xff0c;我们需要去创建一个SpringBoot项目&#xff0c;大家可以去 http://start.spring.io/ 这个网站生成一个项目。如图&#xff0c;这边可以对SpringBoot项目进行详细设置&#xff1a;下面这个web一定要勾选&#xff1a;SpringBoot版本号选择1.5.10全部设置好…

优雅降级和渐进增强

作为一名前端开发人员&#xff0c;最头疼的莫过于浏览器兼容。远古时期万恶的IE6&#xff0c;到现在CSS3不兼容的IE7/8.为了保证不同版本浏览器都有共同或更优化的用户体验&#xff0c;前端搬砖的我们不得不与浏览器兼容顽强斗争。而渐进增强和优雅降级两种不同的开发流程&…

全国计算机等级考试题库二级C操作题100套(第44套)

第44套&#xff1a; 函数fun的功能是进行数字字符转换。若形参ch中是数字字符’0’&#xff5e;’9’, 则 ‘0’转换成’9’,‘1’转换成’8’&#xff0c;‘2’转换成’7’&#xff0c;……&#xff0c;‘9’转换成’0’&#xff1b;若是其它字符则保持不变&#xff1b;并将转…

ASP.Net中实现中英文复合检索文本框

前段时间&#xff0c;写一个用户部门的管理页面&#xff0c;需要对后台获取的用户数据实现英汉检索功能。  同时&#xff0c;选定一个选项之后&#xff0c;需要触发事件与后台交互&#xff0c;将该用户所在的部门显示到页面右边的ListBox控件中。 一、Dojo的FilteringSelect组…

sklearn 安装_初识sklearn

我的主业是互联网运营&#xff0c;业余的python爱好者&#xff0c;学习python已经快两年&#xff0c;主攻网络爬虫与数据分析&#xff0c;爬虫能使用代理ip、打码平台、OCR识别、基本的js逆向处理反爬&#xff1b;数据分析主要使用pandas与pyecharts进行可视化&#xff0c;我的…

2018.08.02 hdu1558 Segment set(并查集+计算几何)

传送门 这个直接用并查集维护。 每加入一条线段就将它与其他能相交的集合合并&#xff0c;维护一个sizesize域表示每个集合的大小。 代码&#xff1a; #include<bits/stdc.h> #define eps 1e-15 using namespace std; int t,fa[1005],n,siz[1005],cnt; struct pot{dou…

全国计算机等级考试题库二级C操作题100套(第45套)

第45套&#xff1a; 函数fun的功能是&#xff1a;把形参a所指数组中的偶数按原顺序依次存放到a[0]、 a[1]、a[2]、……中&#xff0c;把奇数从数组中删除&#xff0c;偶数个数通过函数值返回。例如&#xff1a; 若a所指数组中的数据最初排列为&#xff1a;9、1、4、2、3、6、5…

java singleton inner class_关于java:Singleton设计模式实现

我看到了不同种类的singleton类实现。然而&#xff0c;这个特定的实现&#xff1a;https://sourcemaking.com/design_patterns/singleton/java/1不在私有构造函数中创建对象。有人能解释一下&#xff0c;这两种实现之间的优缺点是什么吗&#xff1f;给出的描述是最小的&#xf…

python中import os_python import osgeo.gdal出错

用anaconda安装的python和各种包&#xff0c;linux和windows下都有&#xff0c;其中前者是2.7版本&#xff0c;而后者是3.x&#xff0c;用conda install gdal安装gdal包之后&#xff0c;当运行from osgeo import gdal​时出现了各种问题。 windows下的问题​ ​ImportError Tra…