位置: IT常识 - 正文

java8 (jdk 1.8) 新特性——Lambda

编辑:rootadmin
java8 (jdk 1.8) 新特性 ——初步认识 1. 什么是lambda? 目前已知的是,有个箭头 -> 说一大段官方话,也没有任何意义 我们直接看代码: 之前我们创建线程是这样的 Runnable runnable = new Runnable() { @Override public vo ...

推荐整理分享java8 (jdk 1.8) 新特性——Lambda,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

java8 (jdk 1.8) 新特性 ——初步认识

1. 什么是lambda?

目前已知的是,有个箭头->

说一大段官方话,也没有任何意义

我们直接看代码:

之前我们创建线程是这样的

Runnable runnable = new Runnable() { @Override public void run() { System.out.println("run。。。。。。"); } }; runnable.run();

用lambda:

Runnable run2 = () -> System.out.println("run。。。。。。");run2.run();

  

是不是感觉特别离谱,看不懂

别急,还有更离谱的

很常见的一个例子,比较两个整数的大小

之前是这样写的

Comparator<Integer> myCom = new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return Integer.compare(o1, o2);}};int compare = myCom.compare(12, 20);int compare1 = myCom.compare(20, 12);int compare2 = myCom.compare(20, 20);System.out.println(compare);System.out.println(compare1);System.out.println(compare2);}

  

用lambda:

Comparator<Integer> myCom = (o1, o2) -> Integer.compare(o1, o2);int compare = myCom.compare(12, 20);int compare1 = myCom.compare(20, 12);int compare2 = myCom.compare(20, 20);System.out.println(compare);System.out.println(compare1);System.out.println(compare2);

  甚至还可以这样 (这个是方法引用)

Comparator<Integer> myCom = Integer::compare;int compare = myCom.compare(12, 20);int compare1 = myCom.compare(20, 12);int compare2 = myCom.compare(20, 20);System.out.println(compare);System.out.println(compare1);System.out.println(compare2);

  

第一个数比第二个数

大 :返回 1

小:返回 -1

相等:返回 0

刚接触是不是黑人问号,这是什么玩意

很好,到这,你认识到了lambda 一个缺点,可阅读性差,优点 代码简洁

小结:看到 -> lambda 看到 : :方法引用

2. lamdba 语法

基本语法

1. 箭头操作符 -> 或者叫做lambda 操作符

2. 箭头操作符将lambda 表达式拆分成两部分

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

右侧:Lambda 表达式中所需执行的功能 , 即 Lambda 体

3.语法格式

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

() -> system.out.println("Hello Lambda")

  

前边线程的那个例子就是

语法格式2:有一个参数 无返回值

(x)-> System.out.println(x);

  

若只有一个参数可以省略不写

x-> System.out.println(x);

  

java8 (jdk 1.8) 新特性——Lambda

之前的写法,没有使用lambda

Consumer<String> consumer = new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println("输出的值:"+s);}};consumer.accept("今天不想emo了");

  

使用lambda

Consumer<String> consumer = s -> System.out.println("输出的值:"+s);consumer.accept("今天不想emo了");

 

语法格式3:有两个以上参数 ,并且lambda体有多条语句,有返回值

Comparator<Integer> myCom = (o1, o2) -> {System.out.println("其他语句");return Integer.compare(o1, o2);};

  

语法格式4 lambda体中只有一条语句,return 和 大括号都可以省略不写

Comparator<Integer> com =(x,y)-> Integer.compare(x,y);

  有没有发现所有的参数,都没有参数类型,之前我们写函数的时候可是要带上参数类型的

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

4.函数式接口

不管上面哪一种语法格式,lambda都是需要函数式接口的支持

函数式接口:接口中只有一个抽象方法的接口 称为函数式接口

可以使用一个注解@FunctionalInterface 修饰,可以检查是否是函数式接口

我们可以看看Runnable 接口 的源码

完成的接口类代码如下

/** Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms/package java.lang;/*** The <code>Runnable</code> interface should be implemented by any* class whose instances are intended to be executed by a thread. The* class must define a method of no arguments called <code>run</code>.* <p>* This interface is designed to provide a common protocol for objects that* wish to execute code while they are active. For example,* <code>Runnable</code> is implemented by class <code>Thread</code>.* Being active simply means that a thread has been started and has not* yet been stopped.* <p>* In addition, <code>Runnable</code> provides the means for a class to be* active while not subclassing <code>Thread</code>. A class that implements* <code>Runnable</code> can run without subclassing <code>Thread</code>* by instantiating a <code>Thread</code> instance and passing itself in* as the target. In most cases, the <code>Runnable</code> interface should* be used if you are only planning to override the <code>run()</code>* method and no other <code>Thread</code> methods.* This is important because classes should not be subclassed* unless the programmer intends on modifying or enhancing the fundamental* behavior of the class.** @author Arthur van Hoff* @see java.lang.Thread* @see java.util.concurrent.Callable* @since JDK1.0*/@FunctionalInterfacepublic interface Runnable {/*** When an object implementing interface <code>Runnable</code> is used* to create a thread, starting the thread causes the object's* <code>run</code> method to be called in that separately executing* thread.* <p>* The general contract of the method <code>run</code> is that it may* take any action whatsoever.** @see java.lang.Thread#run()*/public abstract void run();}

  

可以看到这里面就只有一个实现,有一个注解@FunctionalInterface ,说明它就是一个函数式接口,就可以进行lambda简写

来看 Comparator 也是一样 有@FunctionalInterface注解

这里可能就会有疑问,这边明明是有两个抽象方法,怎么是函数式接口呢?

别急 !!可以看到这边的注释, 说明这个equals 是 重写了超类 的 equals,本质上是对object 的重写,官方定义这样的抽象方法是不会被定义到 抽象接口数的 ,因此实际上只有一个抽象方法

我们自己可以试着定义 函数式接口,很简单

package com.test1.demo;@FunctionalInterfacepublic interface MyFunc {void method();}

  

好了,如果,写两个抽象接口会怎样?

可以看到注解报错了,所以注解用来校验作用就在这

重申一遍,函数式接口:接口中只有一个抽象方法的接口 称为函数式接口

注解只是拿来校验的,方便我们一看就知道这是一函数式接口类,不然还得数个数,验证一下是不是只有一个

现在我也重写equals ,可以看到并没有报错

5. java8 中内置四大核心函数式接口

Consumer<T> 消费型接口

//Consumer 消费型接口@Testpublic void testConsumer() {cosumer(1000, (m) -> System.out.println("星期一" + m));// 星期一1000.0}public void cosumer(double m, Consumer<Double> con) {con.accept(m);}

  

供给型接口 supplier<T>

@Testpublic void testSupplier() {List<Integer> numList = getNumList(10, () -> (int) (Math.random() * 100));for (Integer integer : numList) {System.out.println(integer); //100 以内10位随机整数}}// 需求:产生指定个数的整数放入集合中public List<Integer> getNumList(int num, Supplier<Integer> su) {List<Integer> list = new ArrayList<>();for (int i = 0; i < num; i++) {Integer integer = su.get();list.add(integer);}return list;}

  

Function<T,R> 函数型接口

@Testpublic void FunctioStr(){String c = getFunction("sbjikss", str -> str.toUpperCase());System.out.println(c); //SBJIKSSString sub = getFunction("sbjikss", str -> str.substring(2, 3));System.out.println(sub);//j}public String getFunction( String str, Function<String,String> f) {return f.apply(str);}

  

断言型接口 Predicate<T>

public void tetPre(){List<String> list = Arrays.asList("Hello","sss","xxxx","sjjss");List<String> list1 = filterStr(list, (pre) -> pre.length() > 3);for (String s : list1) {System.out.println(s); // Hello xxxx sjjss}}//需求:将满足条件字符串放入集合中public List<String> filterStr(List<String> old , Predicate<String> pre ){List<String> newList = new ArrayList<>();for (String str : old) {if (pre.test(str)){newList.add(str);}}return newList;}

  

感谢阅读!!!

本文链接地址:https://www.jiuchutong.com/zhishi/310492.html 转载请保留说明!

上一篇:织梦dedecms内容页上一页下一页链接调用教程(织梦cms要钱吗)

下一篇:python中Sobel算子如何使用(sobel算子 opencv)

  • 荣耀30如何把联系人存到SIM卡(荣耀30如何将联系人导入sim卡)

    荣耀30如何把联系人存到SIM卡(荣耀30如何将联系人导入sim卡)

  • 微信内容怎么移到另一个手机(怎么将微信内容迁移到另一个手机)

    微信内容怎么移到另一个手机(怎么将微信内容迁移到另一个手机)

  • 剪映怎么截取视频一段(剪映怎么截取视频中间部分)

    剪映怎么截取视频一段(剪映怎么截取视频中间部分)

  • 无线键盘复位键在哪(无线键盘复位键在哪个位置?)

    无线键盘复位键在哪(无线键盘复位键在哪个位置?)

  • 电脑自带截屏键是哪个(电脑自带截屏键盘按哪个键)

    电脑自带截屏键是哪个(电脑自带截屏键盘按哪个键)

  • 蚂蚁能量296g要走多少步(蚂蚁能量266g)

    蚂蚁能量296g要走多少步(蚂蚁能量266g)

  • 什么软件可以把照片做成视频(什么软件可以把文字转换成语音)

    什么软件可以把照片做成视频(什么软件可以把文字转换成语音)

  • 图片的源文件是什么(图片源文件是什么格式论文)

    图片的源文件是什么(图片源文件是什么格式论文)

  • 抖音直播线下导流什么意思(抖音直播导管)

    抖音直播线下导流什么意思(抖音直播导管)

  • 3dmax初始化闪退(3dmax初始化闪退的三种解决方案)

    3dmax初始化闪退(3dmax初始化闪退的三种解决方案)

  • 如何提高手机音量(如何提高手机音乐音质)

    如何提高手机音量(如何提高手机音乐音质)

  • 荣耀v30pro第一次充电充多久(荣耀v30新手机第一次充电要充多久)

    荣耀v30pro第一次充电充多久(荣耀v30新手机第一次充电要充多久)

  • 电脑为什么会频繁黑屏(电脑为什么会频繁黑屏几秒)

    电脑为什么会频繁黑屏(电脑为什么会频繁黑屏几秒)

  • 淘宝五张主图的分别作用(淘宝主图5张图分别怎么做)

    淘宝五张主图的分别作用(淘宝主图5张图分别怎么做)

  • ns进入休眠模式能下载吗(ns进入休眠模式下载会暂停吗)

    ns进入休眠模式能下载吗(ns进入休眠模式下载会暂停吗)

  • 怎么把照片拼成九宫格(怎么把照片拼成一张图片)

    怎么把照片拼成九宫格(怎么把照片拼成一张图片)

  • qq看点怎么彻底关掉(qq看点怎么彻底删除)

    qq看点怎么彻底关掉(qq看点怎么彻底删除)

  • 魅族16s怎么唤醒语音助手(魅族16t怎么唤醒语音)

    魅族16s怎么唤醒语音助手(魅族16t怎么唤醒语音)

  • 小米9pro怎么设置息屏预览(小米9a怎么设置)

    小米9pro怎么设置息屏预览(小米9a怎么设置)

  • 闲鱼为什么被封(闲鱼为什么经常封账号)

    闲鱼为什么被封(闲鱼为什么经常封账号)

  • 怎么在wps表格里查找(怎么在wps表格里加入斜线)

    怎么在wps表格里查找(怎么在wps表格里加入斜线)

  • qq面对面快传传输失败(qq面对面快传传到哪里了)

    qq面对面快传传输失败(qq面对面快传传到哪里了)

  • 苹果相册怎么改名字(苹果相册怎么改照片格式)

    苹果相册怎么改名字(苹果相册怎么改照片格式)

  • 爱奇艺中怎么彻底删除记录(爱奇艺怎么彻底删除)

    爱奇艺中怎么彻底删除记录(爱奇艺怎么彻底删除)

  • 抖音直播要多少粉丝(抖音直播要多少流量)

    抖音直播要多少粉丝(抖音直播要多少流量)

  • 清理系统中的组件存储(清理系统所有垃圾)

    清理系统中的组件存储(清理系统所有垃圾)

  • linux动态增加LV空间的方法(linux动态扩容)

    linux动态增加LV空间的方法(linux动态扩容)

  • Node.js下载安装及环境配置教程【超详细】(node.js安装步骤)

    Node.js下载安装及环境配置教程【超详细】(node.js安装步骤)

  • 进项税额转出要交企业所得税吗
  • 金税三期是什么意思
  • 什么是原始凭证?审核原始凭证主要审查哪些内容?
  • 企业银行流水可以同步到T+软件中,自动生成凭证了
  • 房产税从租和从价
  • 定额扣除个税什么意思
  • 商业用房出租税率是多少
  • 行政单位的财务报告包括财务报表和财务情况说明书
  • 企业租给企业房产税税率
  • 法院退诉讼费账务处理
  • 工会账户销户划拨流程
  • 汇算清缴残保金填哪里
  • 个人所得税免征项目有哪些
  • 进口产品增值税的组成计税价格
  • 公司代扣代缴个人所得税能查到吗
  • 银行代扣印花税
  • 所得税预警税负率
  • 税务局代开专用发票要缴纳城建税吗?
  • 应税行为扣除额计算怎么填
  • 租用仓库需要代扣代缴企业所得税吗
  • 视同销售如何纳税调整?
  • 新办企业的开办费用应计入( )
  • 债转股的税收政策
  • 远程清卡失败怎么办
  • 办理税务迁移
  • 减少子公司合并的风险
  • win 10 请稍后
  • win11系统摄像头黑屏
  • 企业当期产生的外币报表折算差额
  • vmware download
  • Win10 Build 19043.1147 (21H1)预览通道更新补丁KB5004296(附完整更新日志)
  • 如何选择一款适合自己家庭的凉席
  • 固定资产清理的借贷方向表示什么
  • 会计上社保的分录是什么
  • 代开的发票需要企业盖章还是税务机关盖章?
  • 交易性金融资产的账务处理
  • 初雪与最后的秋天的区别
  • 损益类科目包括利润分配吗
  • 收到债劵利息会减少吗
  • 星空下的灯塔作文
  • php 通信
  • php读取文件内容的方法和函数
  • 临时工交押金会扣钱吗
  • 进口货物交哪些税费
  • 图书免税?
  • 使用xampp建立www服务
  • pd python
  • 保险业务手续费
  • 固定资产科目的期末余额,反映固定资产的原价
  • SQL SERVER 2008 CTE生成结点的FullPath
  • 企业为职工支付的补充医疗保险费
  • 市政绿化工程的施工方案
  • 增值税进项税额加计抵减政策
  • 实收资本的印花税什么时候申报
  • 银行取现怎么预约
  • 个人开具的收据能税前扣除吗
  • 诺诺开票人怎么修改
  • sqlserver的sql文件导入mysql
  • oracle分区大小建议
  • 苹果mac怎么下载淘宝
  • win2016 ntp
  • host文件内容
  • pptp和l2tp哪个比较安全
  • linux系统软件包安装
  • xp任务栏靠右怎么调回来
  • win10如何关闭windows
  • scm是啥
  • linux测试端口连接
  • w10系统屏幕一直在闪
  • opengl立体模型
  • vue缓存数据
  • Unity3D游戏开发标准教程吴亚峰于复兴人民邮电出版社
  • javascript基础笔记
  • React+react-dropzone+node.js实现图片上传的示例代码
  • js点击代码
  • 王军调研地税局的职务
  • 律师到税务机关调取信息
  • 商标注册图形查询
  • 求资金占用利息的公式
  • 残疾人就业保障金怎么申报
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设