一、Lambda

可以把Lambda表达式理解为简洁地i表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还是一个可以抛出的异常列表。

听上去,跟我们用的匿名类,匿名方法什么的很像。我们继续看看把。

第一篇,我们做的事分苹果,这次我们给苹果根据重量来做个Comparator吧。

先来以前的:

  1. Comparator<Apple> byWeight=new Comparator<Apple> () {
  2. @Override
  3. public int compare(Apple o1, Apple o2) {
  4. return o1.getWeight ().compareTo (o2.getWeight ());
  5. }
  6. };

用了lambda:

  1. Comparator<Apple> byWeight=(Apple a1,Apple a2)->a1.getWeight ().compareTo (a2.getWeight ());

是不是很简单。简单讲一下lambda的格式,由lambda参数、箭头、lambda主体三部分组成;

其中lambda参数也可以不用写类型,它会根据上下文自己判断类型,后面有例子出现。

而lambda主题如果像以上表达式只有一句的话,可以不叫{},但有多条语句的话必须加{}。

二、函数式接口

  1. public interface Pridicate<T>{
  2. boolean test(T t);
  3. }

类似上面的接口一样,只定义一个方法的接口,我们称之为函数式接口。Runable,Comparator都是一个函数式接口。当然,并不是严格意义上的只有一个方法,还可以有default修饰的默认方法。

函数式接口的抽象方法的签名基本上就是Lambda表达式的签名,称之为函数描述符。比如,Runable的run()方法,什么也不接收,什么也不返回,Runable可以作为run方法的签名。函数描述符为()->void 。给个栗子!

  1. public class Demo6 {
  2. public static void main(String[] args) {
  3. //old
  4. process (new Runnable () {
  5. @Override
  6. public void run() {
  7. System.out.println ("This is old");
  8. }
  9. });
  10. //new
  11. process (()-> System.out.println ("This is new "));
  12. }
  13. public static void process(Runnable r){
  14. r.run ();
  15. }
  16. }

我们知道process()方法接收的是一个函数式接口,所以我们直接可以用lambda表达式来表示这个函数式接口,()表示不接受参数,lambda主体不返回参数,

完成的功能和上面匿名是一样的。我再来个反例!

  1. Predicate<Apple> predicate=(Apple a)->a.getWeight ();
  2. //Bad return type in lambda expression: Integer cannot be converted to boolean

Apple的getWeight是个Integer返回类型,而,我们需要的是一个boolean类型,所以报错。这里解释一下Predicate等类。

(1)Predicate<T>定义了一个抽象方法test(),返回boolean值。后面可以用来做filter的条件。

像上面的反例,加入我在Apple加一个方法

  1. public boolean islight(){
  2. if(this.getWeight ()>4){
  3. return false;
  4. }
  5. return true;
  6. }

我们就可以写  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>来区分轻重的苹果,我们先来看看方法引用。

  1. Predicate<Apple> predicate=(Apple a)->a.islight ();
  2. //方法引用
  3. Predicate<Apple> predicate1=Apple::islight;

我们看看,Apple的islight()方法是传入一个Apple,返回一个boolean。函数描述符为Apple->boolean。我们先写个自己的Predicate。

  1. class MyPredicate implements Predicate<Apple>{
  2. @Override
  3. public boolean test(Apple apple) {
  4. if (apple.islight ()){
  5. return true;
  6. }
  7. return false;
  8. }
  9. }

使用函数式接口的进阶顺序是:(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. 安卓自定义TextView实现自动滚动

    xml文件代码 <com.mobile.APITest.ScrollEditText android:id="@+id/statusEditText" android:lay ...

  2. nodejs笔记之连接mysql数据库

    1.安装mysql模块: npm install mysql 2.引入mysql模块 创建一个server.js文件 const http = require("http"); c ...

  3. 第十四节 JS面向对象基础

    什么是面向对象:在不需要知道它内部结构和原理的情况下,能够有效的使用它,比如,电视.洗衣机等也可以被定义为对象 什么是对象:在Java中对象就是“类的实体化”,在JavaScript中基本相同:对象是 ...

  4. windows 系统验证是否为正版

    博客园里边写这种帖子,足以证明我有多无聊.话不多说,上干货. 一台计算器如果没有操作系统,就是一块大的板砖,拿起来抡人太重,放地上做床又太小. 如何查看自己操作系统呢?windows7 桌面找到我的电 ...

  5. 让策划也能轻松修改数据的方法:运用Excel2Json2Object插件将xml表格转为Object导入脚本

    让策划也能轻松修改数据的方法:运用Excel2Json2Object插件将xml表格转为Object导入脚本 运用Excel2Json2Object插件将xml表格转为Object导入脚本 下载地址 ...

  6. 利用matplotlib库和numpy库画数学图形

    首先,电脑要安装到matplotlib库和numpy库,这可以通过到命令符那里输入“pip install matplotlib ”,两个操作一样 其次,参照下列代码: import numpy as ...

  7. Haystack全文检索

    1.什么是Haystack Haystack是django的开源全文搜索框架(全文检索不同于特定字段的模糊查询,使用全文检索的效率更高 ),该框架支持Solr,Elasticsearch(java写的 ...

  8. FL studio里的项目设置介绍

    FL studio作为具有众多音乐功能,能够制作多轨音频录制,排序和混音的一款专业软件,我们可以借助VST主机,灵活的调音台,高级MIDI和ReWire支持,来创建专业品质的各种音乐曲目. 而今天我们 ...

  9. Git设置文件或目录忽略跟踪的三种方式

    1. 共享的忽略设置方式 本地仓库根目录,创建.gitignore文件,并编辑正则匹配需要忽略的文件或目录. .gitignore文件需要上传到仓库,同时会影响到他人,共享忽略设置 注意: .giti ...

  10. flutter测试页

    import 'package:flutter/material.dart'; // 应用页面使用有状态Widget class AppScene extends StatefulWidget { @ ...