Java的λ表达(lambda)
λ表达的基本目的
回调Java8的λ表达式 说明了Java8的λ表达式的基本用途:完毕了回调的原意——代码的參数化。
回调:能够简单地说,假设你的方法须要override底层或JDK的某个类的方法,并且你从来没有自己调用过该方法,则该方法(有时候,也指被改写的方法)就是回调。比如
- Applet定义的init()、start()、stop()和destroy();
- 图形绘制方法paint(Graphics)、update(Graphics)和重载的repaint()。
- java.lang.Runnable的run();
- GUI中ActionListener的actionPerformed(ActionEvent e)...
在Java8之前,回调的代码通常由匿名类提供,例如以下代码(完整代码见回调与Java8的λ表达式 )
s.register(new IClient(){
@Override public void callback(int i){
System.out.println("==" + i + "0%");
}
});
如今则能够:
IClient listener1=(i)->{System.out.println("+" + i + "0%");};
s.register(listener1);
s.register((i)->{System.out.println("++" + i + "0%");});
显然,使用λ表达式提供回调代码较匿名类简洁,较Client implements IClient简洁得很多其它。
λ表达式有三部分组成:(參数列表),箭头->,{一个代码块}。
由于IClient是仅有一个抽象方法的接口,既然唯一的抽象方法是
public void callback(int i);
那么,而编译器将赋值给IClient类型变量如listener1的“某λ表达式”,识别为给那个唯一的抽象方法提供方法体的匿名实现类的引用。
从代码输入的角度。λ表达式就能够尽可能的简单。
- IClient listener1= (int i)->{System.out.println("+" + i + "0%");};
//IClient的唯一的抽象方法的方法名不须要了,肯定为callback提供方法体。也不能要方法名。λ表达式的三部分,容不下方法名。 - listener1=(i)->{/**/};
//能够省略i的类型,编译器从唯一的抽象方法的形參列表中能够推导类型 - listener1=i->{};
//仅仅有单一的形參的时候,能够省略λ表达式的形參括号。
其它情况,你能够依照写程序最少的原则。自己试一试。
比如
- (參数列表)部分:有多个參数时,能够(int
i。int j)、(i,j);一个參数,(i)、i->。无參数。()->
如int getX()。其λ表达式为 ()->{return 0;} 或 ()->0;
//yqj2065还想省略形參括号,如同“->0”。
- {一个代码块}部分:多个语句时,方法体;void方法,方法体;有返回值的单一语句。如int
add(int i。int j)。其λ表达式为(i,j)->{return
i+j;} 或 (i,j)->i+j;
函数接口
为什么可以写出
- IClient listener1=某λ表达式;
- s.register(某λ表达式);
由于IClient是仅有一个抽象方法的接口——函数(型)接口(functional
interface)。
- IClient listener1=某λ表达式;
编译器解读为 某λ表达式 为IClient的仅有抽象方法提供代码。尽管IClient“是一个”Object,能够
Object obj= listener1;
可是。
Object obj= 某λ表达式;
感觉上就不太靠谱,“某λ表达式”是为谁的仅有抽象方法提供代码呢?so。
Object obj= (IClient)某λ表达式;//ok - s.register(某λ表达式);
由于依照register(IClient listener),编译器知道 某λ表达式 为IClient的仅有抽象方法提供代码。
函数接口仅仅可以有一个抽象方法。
如果IClient继承Runnable。又想作为函数接口@FunctionalInterface,就得给继承过来的run()提供方法体(这里给一个空方法体凑数)。
package Lower;
/**
* @author yqj2065
*/
@FunctionalInterface
public interface IClient extends Runnable{
int add(int i,int j);
@Override default public void run(){};
}
函数接口(一般地,普通接口)中使用
defaultkeyword,能够加入具有实现的方法,这个玩意就是Java接口的默认方法。
在函数接口中出现默认方法,好像有点理由。一般接口中使用默认方法。參考纠结的默认方法。
Java的λ表达(lambda)的更多相关文章
- Lambda 表达式,Java中应用Lambda 表达式
一.Lambda 表达式 简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数. 链接:知乎 先举一个普通的 Python 例 ...
- Java 8里面lambda的最佳实践
Java 8已经推出一段时间了,越来越多开发人员选择升级JDK,这条热门动弹里面看出,JDK7最多,其次是6和8,这是好事! 在8 里面Lambda是最火的主题,不仅仅是因为语法的改变,更重要的是带来 ...
- JAVA基础知识|lambda与stream
lambda与stream是java8中比较重要两个新特性,lambda表达式采用一种简洁的语法定义代码块,允许我们将行为传递到函数中.之前我们想将行为传递到函数中,仅有的选择是使用匿名内部类,现在我 ...
- Java中的lambda匿名函数使用
Java中的lambda匿名函数使用 lambda匿名函数的使用是为了满足某些情况下需要临时定义函数,或者事先定义,需要时才使用.在python里面,lambda表达式的表达方式为:lambda 参数 ...
- java 8 中lambda表达式学习
转自 http://blog.csdn.net/renfufei/article/details/24600507 http://www.jdon.com/idea/java/10-example-o ...
- Java 终于有 Lambda 表达式啦~Java 8 语言变化——Lambda 表达式和接口类更改【转载】
原文地址 en cn 下载 Demo Java™ 8 包含一些重要的新的语言功能,为您提供了构建程序的更简单方式.Lambda 表达式 为内联代码块定义一种新语法,其灵活性与匿名内部类一样,但样板文件 ...
- Java正则表达中Greedy Reluctant Possessive 的区别
Java正则表达中Greedy Reluctant Possessive 的区别 分类: java2015-01-16 00:28 1280人阅读 评论(9) 收藏 举报 正则表达式Java 目录 ...
- 理解和运用Java中的Lambda
前提 回想一下,JDK8是2014年发布正式版的,到现在为(2020-02-08)止已经过去了5年多.JDK8引入的两个比较强大的新特性是Lambda表达式(下文的Lambda特指JDK提供的Lamb ...
- 8000字长文让你彻底了解 Java 8 的 Lambda、函数式接口、Stream 用法和原理
我是风筝,公众号「古时的风筝」.一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...
- Java 8中Lambda表达式默认方法的模板方法模式,你够了解么?
为了以更简单的术语描述模板方法,考虑这个场景:假设在一个工作流系统中,为了完成任务,有4个任务必须以给定的执行顺序执行.在这4个任务中,不同工作流系统的实现可以根据自身情况自定义任务的执行内容. 模板 ...
随机推荐
- PPP协议总结
PPP协议总结 PPP协议是一种在点到点链路上传输.封装网络数据包的数据链路层协议,PPP支持同步/异步方式的链路上. 一. PPP支持的链路类型 1. 同步和异步专线 2. 同步拨号链路. 3. 异 ...
- codefroce D. Powerful array[初识块状数组]
codefroce D. Powerful array[初识块状数组] 由于是初始所以,仅仅能先用别人的分析.囧... 题目: 给定一个数列:A1, A2,--,An,定义Ks为区间(l,r)中s出现 ...
- Unreal Engine 4 RenderTarget制作Live Camera效果
Unreal Engine 4 RenderTarget制作Live Camera效果 先上效果: Live Camera我不知道怎么翻译.反正意思就是将一个摄影机的Image渲染到一个2D平面上. ...
- git笔记之解决eclipse不能提交jar等文件的问题
今天用git托管了一个java web项目,由于是web项目,所以要上传jar文件(此项目未使用maven管理),一直使用git commit and push,就是在server上看不到jar文件上 ...
- 怎样在万网加入Lync Online SRV记录
万网已经支持SRV记录解析了,可是有好几个朋友问我怎么加入SRV记录(假设域名提供商不支持,能够通过DNSPOD来实现),过程例如以下 1:绑定域名至Office 365 略,请查看我的视频或者博客中 ...
- hdu 5017 Ellipsoid(西安网络赛 1011)
Ellipsoid Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- WPF-21:WPF实现仿安卓的图案密码键盘(初级)
希望大家有这方面好的代码给提供下,谢谢了! 想用C#做一个和手机上一样的图形密码键盘,貌似这方面资料比较少,虽然winphone手机上也有但是网上也没有这方面的代码.只好用常规的思维去实现一下,当然是 ...
- ExtJs自学教程(1):从一切API开始
称号 记得 本系列文章是不是引进全套焦点ExtJs使用,您只需专注于解决ExtJs思考问题.人们不写长篇大论.别人能学会自立.l 有些人只要学会CSS的javascript对于英文不至于很蹩脚(以辅 ...
- UVA 11427 - Expect the Expected(概率递归预期)
UVA 11427 - Expect the Expected 题目链接 题意:玩一个游戏.赢的概率p,一个晚上能玩n盘,假设n盘都没赢到总赢的盘数比例大于等于p.以后都不再玩了,假设有到p就结束 思 ...
- wireshark教程
Wireshark世界上最流行的网络分析工具. 这个强大的工具能够捕捉网络中的数据,并为用户提供关于网络和上层协议的各种信息.与非常多其它网络工具一样.Wireshark也使用pcap network ...