Lambda来源于希腊字母入,
发音为  /'læmdə/
对高数有所了解的人都知道λ用于声明一个数学逻辑系统,表示根据XX的输入参数,会返回某个Y结果。这正是编程语言中函数(方法)的意思。
因此Lambda表达式在编程语言中说白了就是指的一个方法表达式。
为什么要搞出这么一个东西来呢?这是由于我们的编程语言都是按照面向对象设计的,也就是我给你提供几个对象,你给我返回几个对象,但是有时候我们仅仅是把一些算法逻辑传来传去。并不需要一个对象这么完整的结构。
OO语言常用的写法就是把这段算法逻辑作为对象中的某个方法,然后再把这个对象传来传去。这样做固然没问题,但是却对开发人员并不友好,由于大量的冗余代码,导致阅读起来有时候非常费劲。于是编程语言的设计人员就搞出这样一个Lambda表达式,允许算法逻辑(方法)作为一个可传递的对象,进行传递。
Lambda表达式很早就开始出现在其他语言中了,如Lisp、C#(这里不得不提到C#设计的优越性,也说明设计一款编程语言的难度是非常大的。设计的超前了,可能很多人掌握不了如何用。设计的滞后了,很多人又不屑于用)。Java是在Jdk8中开始引入的这个特性,诣在帮助java开发人员从冗余的代码开发中解脱出来。
在说Lambda表达式之前,我们要先引入一个概念:
函数式接口
什么是函数式接口呢?
就是只定义了一个抽象方法的接口,我们可以使用注解@Functionallnterface,来强约束这种接口为函数式接口。
大家可以翻看下jdk8的源码,(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )如Runnable、Callable、Comparator等早期的接口都补充添加了这个注解。
Lambda表达式就是专门用来实现这些函数式接口的表达式,这点非常重要。

 @FunctionalInterface
public interface Runnable {
public abstract void run();
}

下面我们进入正题,应该怎么写Lambda表达式呢?
我们如果想用Runnable起个线程,需要这样写:

 Runnable runnable = new Runnable()
{
@Override
public void run()
{
// TODO
}
};
new Thread(runnable).start();

也就是起一个内部匿名类实现接口中的方法,然后再操作。其实质就是把一段逻辑包含到run方法中,扔给线程去执行。
但是Lambda表达式则可以直接作为一个函数表达式来替代这个内部类。

  Runnable runnable = ()->
{
// dosth
};
new Thread(runnable).start();

在这个例子中,我们可以发现Lambda表示有三部分构成:
1、参数列表:与接口中方法的参数列表要求一致
2、箭头:->  由横线和大于号构成
3、方法体:和方法的方法体要求是一样的
同时Lambda为了更加简洁的(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )做了如下几个改进点:
1、参数列表中的参数类型可以直接都忽略掉不写。(注意是参数类型,不是参数。因为只有一个抽象方法,参数类型是可以直接推导出来的)
2、如果只有一个参数,圆括号也可以省略。
3、方法体如果只有一语句,可以省略掉大括号。
4、如果仅有一条语句,并且他是return语句的话,那么可以直接省略掉return关键字。
直接看下边的例子:

 import java.util.List;

 @FunctionalInterface
public interface ICommand
{
List<Integer> process(Integer[] target);
}
 import java.util.List;

 public class ProcessArray
{
public List<Integer> process(Integer[] target, ICommand cmd)
{
return cmd.process(target);
}
}
 import java.util.Arrays;
import java.util.List; public class JavaLambda
{
public static void main(String[] args)
{
ICommand cmd = tt -> Arrays.asList(tt);
ProcessArray processArray = new ProcessArray();
List<Integer> list2 = processArray.process(new Integer[]
{ 1, 2, 3, 4, 5, 6, 7 }, cmd);
}
}

我们可以发现JavaLambdal类中,第8行代码处,等号右侧:
1、没有声明参数的类型
2、没有参数列表的圆括号
3、方法体没有大括号
4、方法体没有return关键字
例子举的很简单是希望(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )大家能看明白,但是要学会还是要靠自己动手写几个例子。
下篇文章我会写一下下lambda表达式更精简的用法:如何利用已有的方法引用以及java中lambda表达式和内部类使用起来的异同等。

Java中的Lambda表达式的更多相关文章

  1. Lambda 表达式,Java中应用Lambda 表达式

    一.Lambda 表达式 简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数. 链接:知乎 先举一个普通的 Python 例 ...

  2. java中使用Lambda表达式的5种语法

    1,标准写法 思考下述情况: String[] arr = {"program", "creek", "is", "a" ...

  3. Java中的Lambda表达式简介及应用

    在接触Lambda表达式.了解其作用之前,首先来看一下,不用Lambda的时候我们是怎么来做事情的. 我们的需求是,创建一个动物(Animal)的列表,里面有动物的物种名,以及这种动物是否会跳,是否会 ...

  4. Java 中的 Lambda 表达式

    Lambda表达式 Lambda 表达式是 JDK1.8 的一个新特性,又称特殊的匿名内部类,可以取代大部分的匿名内部类,语法更简洁,可以写出更优雅的 Java 代码,可以极大地优化代码结构. Lam ...

  5. java中使用lambda表达式

    使用lambda表达式能够使复杂的编写方式变的简单 lambda表达式的语法 (parameters) -> expression 或 (parameters) ->{ statement ...

  6. 理解和运用Java中的Lambda

    前提 回想一下,JDK8是2014年发布正式版的,到现在为(2020-02-08)止已经过去了5年多.JDK8引入的两个比较强大的新特性是Lambda表达式(下文的Lambda特指JDK提供的Lamb ...

  7. Java中的lambda匿名函数使用

    Java中的lambda匿名函数使用 lambda匿名函数的使用是为了满足某些情况下需要临时定义函数,或者事先定义,需要时才使用.在python里面,lambda表达式的表达方式为:lambda 参数 ...

  8. 在Android中使用Java 8的lambda表达式

    作为一名Java开发者,或许你时常因为缺乏闭包而产生许多的困扰.幸运的是:Java's 8th version introduced lambda functions给我们带来了好消息;然而,这咩有什 ...

  9. C#中的Lambda表达式和表达式树

    在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...

随机推荐

  1. Linux - 服务基础

    /etc/init.d/sendmail start # 启动服务 /etc/init.d/sendmail stop # 关闭服务 /etc/init.d/sendmail status # 查看服 ...

  2. NOIP2018TG题解

    应该不会被禁赛吧qwq Day1 T1 铺设道路 €€£:我 抄 我 自 己 我考场上写的是一个类似于差分的做法,就是开个数组表示某个位置是否贡献答案,从小到大枚举高度,那么一个位置能贡献答案当且仅当 ...

  3. vscode 配置Git

    步骤: 下载Git客户端 配置环境变量 设置vscode与Git的关联 重启 步骤一: 该网址,下载即可. https://git-scm.com/downloads 步骤二: 计算机 > 属性 ...

  4. mysql案例~关于mysql的配置文件个人见解

    mysql 设置参数解读一  mysql的参数分为几类     1 session级别可以设置     2 global级别可以设置     3 session+global级别可以设置     4 ...

  5. 七、Sparse Autoencoder介绍

    目前为止,我们已经讨论了神经网络在有监督学习中的应用.在有监督学习中,训练样本是有类别标签的.现在假设我们只有一个没有带类别标签的训练样本集合  ,其中  .自编码神经网络是一种无监督学习算法,它使用 ...

  6. Python之matplotlib库学习

    matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备, ...

  7. Linux mmc framework2:基本组件之queue

    1.前言 本文主要介绍card下queue组件的主要流程,在介绍的过程中,将详细说明和queue相关的流程,涉及到其它组件的详细流程再在相关文章中说明. 2.主要数据结构和API 2.1 struct ...

  8. python高级编程读书笔记(一)

    python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...

  9. bootstrap 的媒体查询

    有时候需要对bootstap的样式自定义,比如说某个元素的“height”值,要放在与bootstrap媒体查询同步的样式里,才会兼容响应式布局. .container类是bootstrap的官方参考 ...

  10. 云服务器 linux文件系统异常an error occurren during the file system check导致服务器启动失败

    云服务器 linux文件系统异常an error occurren during the file system check导致服务器启动失败 文件系统宕机,重启后报错,无法启动 处理流程: 1.编辑 ...