前几天一位好友分享了一篇文章,其中讲到了lambda表达式,正好最近看了一些内容,就做做笔记吧...

lambda表达式服务于函数式接口,如果需要一个函数式接口的对象时,就可以用lambda表达式代替

什么是函数式接口?

1.最主要的一点是只包含一个抽象方法的接口(Object类的方法不算啊)
2.带有@FunctionalInterface注解的一定是函数式接口,但是不代表没有该注解就表示不是,只要是一个接口,有且只有一个抽象方法,那么就是函数式接口,注解配合编译器可以很好的辅助,我们在自定义函数式接口的时候,也会更加直观,有助于代码的可读性

几个简单的例子

Arrays.sort方法需要一个实现了Comparator接口的实例,正常情况下,我们需要创建一个实例,然后实现Comparator接口,然后将该实例传入Arrays.sort方法中,还是比较繁琐的,但是使用lambda表达式就可以非常简化

编译器如果能推导出参数类型,小括号中的参数类型是可以省略的

        String[] array = new String[3];
array[0] = "ccc";
array[1] = "bb";
array[2] = "a";
System.out.println(array[0]);// 输出ccc
Arrays.sort(array, (first, second) -> first.length() - second.length());
System.out.println(array[0]);// 输出a

对于逻辑比较复杂的代码,逻辑处理部分可以使用{}包起来

        Timer t = new Timer(1000, event -> {
System.out.println("action");
System.out.println("listener");
});
t.start();

表达式也是可以当作一个参数传递的

        String[] array = new String[3];
array[0] = "ccc";
array[1] = "bb";
array[2] = "a";
System.out.println(array[0]);
Comparator<String> comp = (first, second) -> first.length() - second.length();
Arrays.sort(array, comp);
System.out.println(array[0]);

如果没有入参的时候,小括号不能省略

        Thread thread = new Thread(() -> {
for (int i = 0; i < 100; i++) {
System.out.println(i);
}
});
thread.start();

现在工作主要是用Scala语言,Scala在语法等方面对比Java来讲更加函数化,遍历、排序、过滤等操作甚至来讲只用一行代码就可以完成

但是lambda作为Java8的一个大更新,所以还是有必要学习一下新特性的

下面新增一些关于Supplier和Consumer的知识

Supplier也是一个函数式接口,这个接口只有一个返回泛型T的方法

因此如果我们想要得到某个实例,就可以使用这个函数式接口了比如

        // 这个实体有两个构造,一个有参,一个无参
Supplier<LengthComparator> lcp1 = () -> new LengthComparator("a", "b");
// 直接使用构造方法引用,编译器会自动帮我们引用到无参上面去,但是如果我们把无参给注释掉,这里就会报错了
Supplier<LengthComparator> lcp2 = LengthComparator::new;
System.out.println(lcp1.get()); // 打印这个对象的地址 Supplier<String> str = () -> "hello";
System.out.println(str.get()); // 打印hello

Consumer也是一个函数式接口,其中有两个方法:

  一个方法是传个泛型参数,没有返回值;

  还有一个是链式方法;

        /**
* void accept(T t);
*/
Consumer<String> sss = (x) -> System.out.println("x = " + x);
sss.accept("hello"); // x = hello /**
* default Consumer<T> andThen(Consumer<? super T> after)
*/
Consumer<String> ssss = (x) -> System.out.println(x);
ssss.andThen(sss); // 没有任何输出
ssss.andThen(sss).accept("world"); // 先执行ssss的accept方法,再执行sss的accept方法;

由上我们可以看出,Consumer这个接口对于批量操作数据非常的方便,比如有一批数据,需要经过多种逻辑运算,就可以链式使用,这个非常类似于Scala的函数式编程风格,比如list.map(x => x.name).filter(name => name.equals("xxx"))

需要注意的是,链式玩法中,Consumer的泛型必须都是统一类型,因为accept参数需要被多次用到,如果类型不一致,编译报错;

lambda表达式笔记的更多相关文章

  1. 接口和lambda表达式笔记

    接口 接口是双方,即服务提供方和想让它们的对象对服务是可用的那些类,之间约定的一种机制. 声明一个接口 public interface IntSequence{ //不提供实现,则该方法为抽象方法, ...

  2. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  3. 委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式

    引言: 最初学习c#时,感觉委托.事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托.事件学习笔记.今天重新温故委托.事件,并且把最近学习到和委托相关的匿名方法.Lambda表达式及泛型委托记录 ...

  4. 《C#本质论》读书笔记(12)委托和Lambda表达式

    12.1.委托概述 12.1.2 委托的数据类型 为了减少重复代码数量,可以将比较方法作为参数传递给 BubbleSort()方法.此外,为了将方法作为参数传递,必须有一个能够标识方法的数据类型--也 ...

  5. Java8学习笔记----Lambda表达式 (转)

    Java8学习笔记----Lambda表达式 天锦 2014-03-24 16:43:30 发表于:ATA之家       本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人 ...

  6. Java开发笔记(六十一)Lambda表达式

    前面介绍了匿名内部类的简单用法,通过在sort方法中运用匿名内部类,不但能够简化代码数量,还能保持业务代码的连续性.只是匿名内部类的结构仍显啰嗦,虽然它省去了内部类的名称,但是花括号里面的方法定义代码 ...

  7. C# Lambda表达式学习笔记

    本笔记摘抄自:https://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html,记录一下学习过程以备后续查用.     一.Lambda ...

  8. JavaSE学习笔记(13)---线程池、Lambda表达式

    JavaSE学习笔记(13)---线程池.Lambda表达式 1.等待唤醒机制 线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同. 比如:线程A用来生成包子的,线程B用 ...

  9. Java基础进阶:内部类lambda重点摘要,详细讲解成员内部类,局部内部类,匿名内部类,Lambda表达式,Lambda表达式和匿名内部类的区别,附重难点,代码实现源码,课堂笔记,课后扩展及答案

    内部类lambda重点摘要 内部类特点: 内部类可以直接访问外部类,包括私有 外部类访问内部类必须创建对象 创建内部对象格式: 外部类.内部类 对象名=new外部类().new内部类(); 静态内部类 ...

随机推荐

  1. 学习Spring-Data-Jpa(八)---定义方法查询

    1.查询策略 spring-data一共有三种方法查询策略: QueryLookupStrategy.Key.CREATE,尝试根据方法名进行创建.通用方法是从方法名中删除一组特定的前缀,然后解析该方 ...

  2. STATUS_STACK_BUFFER_OVERRUN不一定是栈缓冲区溢出

    STATUS_STACK_BUFFER_OVERRUN异常一般是指栈缓冲区溢出的溢出,代码为0xC0000409,消息提示一般为“Security check failure or stack buf ...

  3. [C++] 对象指针使用方法

    对象指针:指向类对象的指针 类指针指向类变量(对象)的地址 对象指针定义格式: 类类型 *变量名: 举例: #include <iostream> using namespace std; ...

  4. merge同时包含增、改、删

    我们都知道oracle merge可以用来增和改,很少用它来删除.但是有时候我们仍然需要该特性,以提高性能,典型的场景就是将业务库逻辑删除的记录同步到查询库的时候,做真正的物理删除,这个时候merge ...

  5. postgresql - relation 权限相关问题

    GRANT ALL PRIVILEGES ON DATABASE 数据库.[schema] TO [用户名]; GRANT ALL ON schema [schema] TO [用户名]; GRANT ...

  6. excel打开csv 出现乱码

    现在做舆情分析的相关项目,在数据处理的时候,发现了一个问题.将数据写入到csv文件,用excel打开(默认)就会出现乱码,如果将数据写入到.xlsx文件就不会出现乱码,因为csv是通用格式,所以我猜想 ...

  7. Java12新特性 -- Shenandoah GC

    Shenandoah 垃圾回收器是 Red Hat 在 2014 年宣布进行的一项垃圾收集器研究项目 Pauseless GC 的实现,旨在针对 JVM 上的内存收回实现低停顿的需求.该设计将与应用程 ...

  8. IDEA 开发javafx: error: java:package javafx.application does not exist

    1)jdk使用1.8, 1.7中未包含javafx相关内容. 2)确保classpath中加入了javafx包路径. 在“file” --> "project structure&qu ...

  9. EasyNVR摄像机网页H5全平台无插件直播流媒体播放服务二次开发之接口鉴权示例讲解

    背景需求 EasyNVR的使用者应该都清楚的了解到,EasyNVR一个强大的功能就是可以进行全平台的无插件直播.主要原因在于rtsp协议的视频流(默认是需要插件才可以播放的)经由EasyNVR处理可以 ...

  10. tp5 Class 'gmars\rbac\Rbac' not found

    tp强调的是资源的自动加载,自动加载前提是要配置进去,不管是手工还是系统自动配置. 解决方案:查看autoload_psr4.php文件,如果没有的话,是composer的操作哪里有问题.