java8实战二------lambda表达式和函数式接口,简单就好
一、Lambda
可以把Lambda表达式理解为简洁地i表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还是一个可以抛出的异常列表。
听上去,跟我们用的匿名类,匿名方法什么的很像。我们继续看看把。
第一篇,我们做的事分苹果,这次我们给苹果根据重量来做个Comparator吧。
先来以前的:
Comparator<Apple> byWeight=new Comparator<Apple> () {
@Override
public int compare(Apple o1, Apple o2) {
return o1.getWeight ().compareTo (o2.getWeight ());
}
};
用了lambda:
Comparator<Apple> byWeight=(Apple a1,Apple a2)->a1.getWeight ().compareTo (a2.getWeight ());
是不是很简单。简单讲一下lambda的格式,由lambda参数、箭头、lambda主体三部分组成;

其中lambda参数也可以不用写类型,它会根据上下文自己判断类型,后面有例子出现。
而lambda主题如果像以上表达式只有一句的话,可以不叫{},但有多条语句的话必须加{}。
二、函数式接口
public interface Pridicate<T>{
boolean test(T t);
}
类似上面的接口一样,只定义一个方法的接口,我们称之为函数式接口。Runable,Comparator都是一个函数式接口。当然,并不是严格意义上的只有一个方法,还可以有default修饰的默认方法。
函数式接口的抽象方法的签名基本上就是Lambda表达式的签名,称之为函数描述符。比如,Runable的run()方法,什么也不接收,什么也不返回,Runable可以作为run方法的签名。函数描述符为()->void 。给个栗子!
public class Demo6 {
public static void main(String[] args) {
//old
process (new Runnable () {
@Override
public void run() {
System.out.println ("This is old");
}
});
//new
process (()-> System.out.println ("This is new "));
}
public static void process(Runnable r){
r.run ();
}
}
我们知道process()方法接收的是一个函数式接口,所以我们直接可以用lambda表达式来表示这个函数式接口,()表示不接受参数,lambda主体不返回参数,
完成的功能和上面匿名是一样的。我再来个反例!
Predicate<Apple> predicate=(Apple a)->a.getWeight ();
//Bad return type in lambda expression: Integer cannot be converted to boolean
Apple的getWeight是个Integer返回类型,而,我们需要的是一个boolean类型,所以报错。这里解释一下Predicate等类。
(1)Predicate<T>定义了一个抽象方法test(),返回boolean值。后面可以用来做filter的条件。
像上面的反例,加入我在Apple加一个方法
public boolean islight(){
if(this.getWeight ()>4){
return false;
}
return true;
}
我们就可以写 Predicate<Apple> predicate=(Apple a)->a.islight (); 这样就不会报错。
java8中常用的函数式接口:

所谓原始类型转化,其实很容易理解,像IntToDoubleFunction: IntToDoubleFunction i=(int s)->s*1.0; 对传入的s返回double。不用声明泛型,根据字面意思
int转double。
此外,lambda其实能根据上下文推断传入参数的类型: IntToDoubleFunction i=s->s*1.0; 因为IntToDoubleFunction的函数描述符式T->R,它自动判断s是int。
三、方法引用
上文中我们设计了一个Predicate<Apple>来区分轻重的苹果,我们先来看看方法引用。
Predicate<Apple> predicate=(Apple a)->a.islight ();
//方法引用
Predicate<Apple> predicate1=Apple::islight;
我们看看,Apple的islight()方法是传入一个Apple,返回一个boolean。函数描述符为Apple->boolean。我们先写个自己的Predicate。
class MyPredicate implements Predicate<Apple>{
@Override
public boolean test(Apple apple) {
if (apple.islight ()){
return true;
}
return false;
}
}
使用函数式接口的进阶顺序是:(1)自己写实现类,(2) Predicate<Apple> predicate=a->a.islight ();
(3) Predicate<Apple> predicate1=Apple::islight;
(2)和(3)都是直接用lambda表达式表示Predicate。而(3)中用方法引用,使得代码,更加简洁。
我们应该注意:我们调的方法是Apple的islight(),函数描述符要符合函数式接口的函数描述符。合理的使用能使你的代码更加简洁。
这次,就写这些了。
陆续更新。
java8实战二------lambda表达式和函数式接口,简单就好的更多相关文章
- java8 Lambda 表达式和函数式接口快速理解
前言 接上篇文章 java8 新特性 由于上篇过于庞大,使得重点不够清晰,本篇单独拿出 java8 的 Lambda 表达式和函数式接口说明. Lambda 表达式 lambda 表达式其实就是使用了 ...
- Java8 Lambda表达式、函数式接口和方法引用
目录 Java8 Lambda表达式和函数式接口 Lambda表达式 Lambda的使用 函数式接口FunctionalInterface Java内置四大核心函数式接口 方法引用 构造器引用 Jav ...
- Lambda表达式和函数式接口
写在有道笔记中,链接地址.欢迎各位看官提出意见交流讨论 http://note.youdao.com/noteshare?id=147109f1bf7f3ae97c43d77891e6ebc8 Lam ...
- 009-jdk1.8版本新特性一-展方法,Lambda表达式,函数式接口、方法引用构造引用
一.JDK1.8 名称:Spider(蜘蛛) 发布日期:2014-03-18 新特性: 1.1.扩展方法[接口的默认方法] Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 defaul ...
- Lambda表达式与函数式接口
Lambda表达式的类型,也被称为目标类型(targer type),Lambda表达式的目标类型必须是"函数式接口(functional interface)".函数式接口代表只 ...
- Java8新特性(一)——Lambda表达式与函数式接口
一.Java8新特性概述 1.Lambda 表达式 2. 函数式接口 3. 方法引用与构造器引用 4. Stream API 5. 接口中的默认方法与静态方法 6. 新时间日期 API 7. 其他新特 ...
- java8新特性1:lambda表达式和函数式接口
1.lambda的介绍: 1.1.为什么java语言需要引入lambda表达式? java语言诞生于1995年,历史时间已经相对较长了.在其后的各种新型编程语言中,都有着lambda表达式的内容,并且 ...
- Java8新特性_lambda表达式和函数式接口最详细的介绍
Lambda表达式 在说Lambda表达式之前我们了解一下函数式编程思想,在数学中,函数就是有输入量.输出量的一套计算方案,也就是“拿什么东西做什么事情”. 相对而言,面向对象过分强调“必须通过对象的 ...
- Java8新特性-Lambda表达式是什么?
目录 前言 匿名内部类 函数式接口 和 Lambda表达式语法 实现函数式接口并使用Lambda表达式: 所以Lambda表达式是什么? 实战应用 总结 前言 Java8新特性-Lambda表达式,好 ...
随机推荐
- oracle:SQL时间段
oracle: SQL时间段 CREATEDATE between to_date('" + startDate + " 00:00:00','yyyy-mm-dd hh24:mi ...
- GTID 跳过事物
Mysql5.7 stop slave; set @@SESSION.GTID_NEXT='507e80e9-3648-11e9-aa70-fa163e77a52d:20173'; begin; co ...
- python:循环定义、赋值多个变量
exec函数,可以循环定义.赋值多个变量 exec ("temp%s=1"%1) 这段代码的意思是,让exec执行temp1=1.字符串里面的%s由‘1’代替了. 我们在外面再 ...
- JSP页面静态包含和动态包含的区别与联系
---恢复内容开始--- JSP页面静态包含和动态包含的区别与联系: 1.<%@ include file=" " %> 是指令元素,<jsp:include p ...
- JavaWeb三大组件
一.JavaWeb三大组件 Servlet,Listener,Filter.它们在JavaWeb开发中分别提供不同的功能. JavaWeb三大组件都必须在Web.xml中配置 二.三大组件 1.Ser ...
- Price Channel Breakout 交易系统简价及源码
Price Channel Breakout 交易系统简价及源码 既然这个版有交易系统的模型报告,小弟先在这裡野人献曝一下,把目前正在用的系统拿来请大家批评指教一下. ================ ...
- 阿里云centos怎么用xshell5登陆
第一种是用ssh,安装Xshell5 打开XShell 新建会话输入ip 选择新建的会话,点击连接,选择接受并保护,输入root,点击确定 输入密码 已经连接成功了,用Xshell ...
- Java 问题定位工具 -- jps
概览 最近老大布置的任务就是质量加固,偶然看到了一些对于 Java 性能分析的介绍,因此,有了此篇学习笔记. JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jCons ...
- 还原真实,javascript之预编译 / 预解析
今天在群里吹水时,有群友提出一个问题.我一看很简单,就立马给出了答案:因为存在变量提升,所以输出undefined.本以为无人反驳,可确招来口诛笔伐.作为写实派的我,一贯以来坚持真实是我的使命,岂能容 ...
- win10 开机自启指定软件
开机自启 %programdata%\Microsoft\Windows\Start Menu\Programs\StartUp