lambda是什么

“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。

将一个变量传入一个匿名函数然后对传入函数进行操作。由于java中并没有脱离类而存在的函数,所以通常独立函数是以一个匿名内部类+一个方法构成的。lambda表达式代替的函数既没有方法名也没有访问修饰符、明确的返回类型声明。

实现解析

下面将解析下lambda与java的逻辑。

函数式变换最大的特点是:将一个函数(方法)赋值给一个变量。

函数式编程环境中比如javaScript

var fun = function(){

...

}

那么在Java中大概是这个样子的。

var doSomthing = public void doSomthing(){

...

}

这个public 关键字是多余的,代码就变成了这个样子。

var doSomthing = void doSomthing(){

...

}

这个返回值类型可以依据内部return类型推导,所以返回值类型也不须要的。

var doSomthing = doSomthing(){

...

}

方法名在之前已经定义过了,代码就变成了这个样子。

var doSomthing = (){

...

}

由于这样看起来怪怪的。所以使用->来定义方法参数和主体。()表示方法的参数列表,{}内部表示方法体。单行方法体可以省略{},强烈不建议这么做。

var doSomthing = ()->{

...

}

这就相当于一个代码块被赋值给了一个变量,这就是一个lambda表达式。

var这个关键字1.8版本的java中是没有的。那么这个变量是什么呢。

在java1.8中所有的 lambda表达式本身就是某个接口的实现,所以var应该是某个接口。

下面定义一个接口

public interface MethodInterface {

void doSomething();

}

一个接口函数需要被实现的接口类型,我们叫它”函数式接口“。为了避免后来的人在这个接口中增加接口函数导致其有多个接口函数需要被实现,变成"非函数接口”,我们可以在这个上面加上一个声明@FunctionalInterface, 这样别人就无法在里面添加新的接口函数了。

@FunctionalInterface

public interface MethodInterface {

void doSomething();

}

函数式接口通常只有一个方法。

我们就可以直接把Lambda作为参数传给函数, 而传统的Java必须有明确的接口实现的定义。

那么上面的函数就成了

MethodInterface methodInterface = ()->{

...

}

那么我们将如何使用它呢.

methodInterface.doSomthing();

这么调用即可。

这个接口通用性很强并且定义起来太麻烦,我们是不是有其他办法替换掉MethodInterface这个接口。

有的,在jdk1.8的java.util.function包中包含了大量定义好的接口。

接口名

参数

返回值

Consumer

T

void

BiConsumer

T,U

void

BiConsumer

T,U

R

BooleanSupplier

Boolean

DoubleBinaryOperator

Double,Double

Double

以上列举并不完全。

当然可以向上述文章那样自定义接口方法类型但是需要@FunctionalInterface注解

实战代码

创建线程接口方式

接口

package java.lang;

@FunctionalInterface

public interface Runnable {

void run();

}

public class LambdaTest {

private static final int TOTAL = 5000;

private static AtomicInteger i = new AtomicInteger(0);

public static void main(String[] args) throws InterruptedException {

Executor executor = Executors.newCachedThreadPool();

CountDownLatch countDownLatch = new CountDownLatch(TOTAL);

for(int j=0;j

executor.execute(()->{

add();

countDownLatch.countDown();

});

}

countDownLatch.await();

System.out.println("求和的结果为:"+i);

}

private static void add(){

i.incrementAndGet();

}

}

总结

一个代码块被赋值给了一个变量。

lambda表达式本身就是某个接口的实现。

java lambda 是什么_自己理解Java中的lambda相关推荐

  1. 深入理解Java虚拟机知乎_深入理解Java虚拟机(类文件结构)

    深入理解Java虚拟机(类文件结构) 欢迎关注微信公众号:BaronTalk,获取更多精彩好文! 之前在阅读 ASM 文档时,对于已编译类的结构.方法描述符.访问标志.ACC_PUBLIC.ACC_P ...

  2. java调用子系统代码_深入理解JAVA虚拟机-Idea远程执行本地Java代码 - Java 技术驿站-Java 技术驿站...

    今天在看深入理解JAVA虚拟机的9.3节,作者实现了一个远程执行功能.这个功能可以在远程服务器中临时执行一段程序代码,而去不依赖jdk版本,不改变原有服务端程序的部署,不依赖任何第三方库,不入侵原有的 ...

  3. java虚引用作用_深入理解Java中的引用(二)——强软弱虚引用

    深入理解Java中的引用(二)--强软弱虚引用 在上一篇文章中介绍了Java的Reference类,本篇文章介绍他的四个子类:强引用.软引用.弱引用.虚引用. 强引用(StrongReference) ...

  4. java 接口和虚构_深入理解Java的接口和抽象类

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

  5. Java虚拟机不能满足_深入理解Java虚拟机--读书笔记1/3

    <深入理解Java虚拟机-JVM高级特性与最佳实践> Chap 2 Java内存区域与内存溢出异常 1.Java运行时数据区域 A.程序计数器:当前线程所执行字节码的行号指示器,线程私有( ...

  6. java虚拟机编译顺序_深入理解Java虚拟机(程序编译与代码优化)

    文章首发于微信公众号:BaronTalk,欢迎关注! 对于性能和效率的追求一直是程序开发中永恒不变的宗旨,除了我们自己在编码过程中要充分考虑代码的性能和效率,虚拟机在编译阶段也会对代码进行优化.本文就 ...

  7. java抽象类的属性_深入理解Java抽象类

    基础部分内容差不多讲解完了,今天开始进入Java提高篇部分,这部分内容会比之前的内容复杂很多,希望大家做好心理准备,看不懂的部分可以多看两遍,仍不理解的部分那一定是我讲的不够生动,记得留言提醒我. 好 ...

  8. java byte 判断相等_深入理解Java装箱与拆箱

    写给小白看的Java基础知识,阅读本文大概需要7分钟 Java中有8种基础数据类型,boolean,char,byte,short,int,long,float,double.从jdk5开始提供了自动 ...

  9. java的弱引用_深入理解Java中的弱引用

    不久之前,我面试了一些求职Java高级开发工程师的应聘者.我常常会面试他们说,"你能给我介绍一些Java中得弱引用吗?",如果面试者这样说,"嗯,是不是垃圾回收有关的?& ...

最新文章

  1. java串口通信DataRecive_串口通信之DataReceive事件触发时机
  2. UA MATH571B 试验设计V 析因设计简介
  3. android6.0源码分析之Camera2 HAL分析
  4. git、github、gitlab、gitee的区别
  5. 2017.3.25 魔术球问题 思考记录
  6. 微星主板黑苹果_组装电脑哪个主板好?如何选择电脑主板?2020年电脑主板推荐及分析。...
  7. c语言劝学,11劝学.doc
  8. 养肾=养命!这5个养肾方法,程序员都保存好了!
  9. 网页全屏的代码实现要不要了解一下(最全)
  10. IDEA 编辑文档 提示:只读文档
  11. linux进程管理数据结构,谢烟客---------Linux之进程管理基础概念
  12. eclipse:解决 The word is not correctly spelled问题
  13. c语言编译kbhit出现问题,在VC++中运行出现error C2065: 'kbhit' : undeclared identifier,什么意思?怎么调试?...
  14. 林光常颠覆传统的养生观 ,养生必读
  15. 预约上门App平台的接单方式
  16. CTF中php相关考点
  17. 格式化JSON字符串
  18. WordPress搭建“外贸独立站”完整操作教程
  19. 工具 xshell无法使用,需要更新的问题
  20. 现代通信原理与技术 matlab,现代通信原理与技术.pdf

热门文章

  1. 六一新玩法!AI涂鸦秒变精美艺术画
  2. Siemens.Oil Gas Manger(OGM).V1.6.3
  3. 彩色图像、灰度图像、二值图像和索引图像区别
  4. 计算机考研302分调剂,艺术生考研302(艺术生考研302分能调剂到哪个学校)
  5. 无线传感器网络 与 OMNET++学习笔记(一)
  6. CIO40知识星球:IT中年男减肥20斤
  7. sid,eld,sidd dataset介绍,eld dataste, dng图像处理
  8. ToolTips Notifications
  9. 关于云桌面好不好用和云桌面厂家哪个好,只能说仁者见仁智者见智的
  10. matlab 风速模型 小波滤波