一、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表达式和函数式接口,简单就好的更多相关文章

  1. java8 Lambda 表达式和函数式接口快速理解

    前言 接上篇文章 java8 新特性 由于上篇过于庞大,使得重点不够清晰,本篇单独拿出 java8 的 Lambda 表达式和函数式接口说明. Lambda 表达式 lambda 表达式其实就是使用了 ...

  2. Java8 Lambda表达式、函数式接口和方法引用

    目录 Java8 Lambda表达式和函数式接口 Lambda表达式 Lambda的使用 函数式接口FunctionalInterface Java内置四大核心函数式接口 方法引用 构造器引用 Jav ...

  3. Lambda表达式和函数式接口

    写在有道笔记中,链接地址.欢迎各位看官提出意见交流讨论 http://note.youdao.com/noteshare?id=147109f1bf7f3ae97c43d77891e6ebc8 Lam ...

  4. 009-jdk1.8版本新特性一-展方法,Lambda表达式,函数式接口、方法引用构造引用

    一.JDK1.8 名称:Spider(蜘蛛) 发布日期:2014-03-18 新特性: 1.1.扩展方法[接口的默认方法] Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 defaul ...

  5. Lambda表达式与函数式接口

    Lambda表达式的类型,也被称为目标类型(targer type),Lambda表达式的目标类型必须是"函数式接口(functional interface)".函数式接口代表只 ...

  6. Java8新特性(一)——Lambda表达式与函数式接口

    一.Java8新特性概述 1.Lambda 表达式 2. 函数式接口 3. 方法引用与构造器引用 4. Stream API 5. 接口中的默认方法与静态方法 6. 新时间日期 API 7. 其他新特 ...

  7. java8新特性1:lambda表达式和函数式接口

    1.lambda的介绍: 1.1.为什么java语言需要引入lambda表达式? java语言诞生于1995年,历史时间已经相对较长了.在其后的各种新型编程语言中,都有着lambda表达式的内容,并且 ...

  8. Java8新特性_lambda表达式和函数式接口最详细的介绍

    Lambda表达式 在说Lambda表达式之前我们了解一下函数式编程思想,在数学中,函数就是有输入量.输出量的一套计算方案,也就是“拿什么东西做什么事情”. 相对而言,面向对象过分强调“必须通过对象的 ...

  9. Java8新特性-Lambda表达式是什么?

    目录 前言 匿名内部类 函数式接口 和 Lambda表达式语法 实现函数式接口并使用Lambda表达式: 所以Lambda表达式是什么? 实战应用 总结 前言 Java8新特性-Lambda表达式,好 ...

随机推荐

  1. Spring Boot默认的JSON解析框架设置

    方案一:启动类继承WebMvcConfigurerAdapter,覆盖方法configureMessageConverters ... @SpringBootApplication public cl ...

  2. 服务器告警其一:硬盘raid问题

    问题描述 服务器一直间断发出告警音,但是根据raid类型的不同有一定可能进入系统. 问题详情 在LSI Mega Webbios自检之后系统开始出现告警音. 在Lsi Mega Webbios的ini ...

  3. 编译原理---antlr实践+编译过程理解+课程理解知识点

    0.其他说明 0.0编译器分为前.中.后端,课上主要学的是前端.前端又分为词法分析(lexical analysis).语法分析(syntax analysis).语义分析(semantic anal ...

  4. DB2数据库常用的函数

    1.value函数 语法value(表达式1,表达式2)value函数是用返回一个非空的值,当其第一个参数非空,直接返回该参数的值,如果第一个参数为空,则返回第一个参数的值. eg:表示如果T1.ID ...

  5. Path Analyzer Pro出现raw socket问题

    使用windows7,8以及10平台运行一个traceroute liketools软件,名为Path Analyzer Pro 2.7,遇到raw socket问题,如图: 原因是raw socke ...

  6. 服务器硬件与linux系统

    服务器的特性: 高速度的CPU运算能力 长时间的可靠运行 强大的I/O外部数据吞吐能力 服务器通常具有更高的性能,效率,高可靠,高可用性,以及更好的扩展性. 服务器的分类 (1)服务器按外形分类 塔式 ...

  7. CentOS7 下设置静态IP

    1.更改虚拟机网络适配器 虚拟机-->设置-->网络适配器  网络连接选择NAT模式 2.设置虚拟网络编辑器 编辑-->虚拟网络编辑器 3.修改本地VMnet8IP 4.修改linu ...

  8. javascript自定义一个全类型读取的函数

    我爱撸码,撸码使我感到快乐!大家好,我是Counter.因为我们知道,在JavaScript中有自带的方法可以读取类型,但是不很全面,今天来分享下如何自己定义一个函数,将所有传入参数的类型给打印出来, ...

  9. 调参贝叶斯优化(BayesianOptimization)

    from sklearn.datasets import make_classification from sklearn.model_selection import cross_val_score ...

  10. Gridview标题头添加排序图片

    向gridview标题头中添加排序图片,当点击某一个头标题时,在标题中出现升序箭头向上的图片,再点击一次时降序,在标题中出现箭头向下的图片,初始页面时在标题头中并不现实任何图片. 先定义好一个grid ...