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 - 文件操作

    touch file # 创建空白文件 rm -rf 目录名 # 不提示删除非空目录(-r:递归删除 -f强制) dos2unix # windows文本转linux文本 unix2dos # lin ...

  2. Python之print(args)与sys.stdout.write(string)使用总结

    一.sys.stdout.write(string) import sys; # sys.stdout.write(): # 1.默认不换行 # 2.参数必须是字符串 # demo 01 x = &q ...

  3. sqlite limit offset

    limit 0,20 表示从第1条开始取20条数据 limit 20 offset 2  表示从第2条开始取出20条数据

  4. mysql 架构~mgr具体细节分析

    一 简介:今天咱们来聊聊mgr的具体实现细节 二 关于多点写入的锁冲突问题以及处理:   certify模块主要负责检查事务是否允许提交,是否与其它事务存在冲突,如两个事务可能修改同一行数据.在单机系 ...

  5. Application生命周期

    onCreate 在创建应用程序时创建 onTerminate 当终止应用程序对象时调用,不保证一定被调用,当程序是被内核终止以便为其他应用程序释放资源,那么将不会提醒,并且不调用应用程序的对象的on ...

  6. Debian Linux Error “Driver 'pcspkr' is already registered, aborting...”

    问题: Error: Driver ‘pcspkr’ is already registered, aborting… 解决: [root@reistlin.com ~]# echo "bl ...

  7. 【逆向工具】逆向工具101editor使用-游戏快速通关

    [渡者游戏简介] 船夫小江将运送客人的,羊.狐狸.草等物品过河,如果留下动物被其它种类吃掉任务就失败了.你需要帮助他做出正确的顺序选择.Ferryman是一款根据经典谜题改编的解谜游戏. 一.查看文件 ...

  8. 转载 - CNN感受野(receptive-fields)RF

    本文翻译自A guide to receptive field arithmetic for Convolutional Neural Networks(可能需要FQ才能访问),方便自己学习和参考.若 ...

  9. JavaScript中 this 的指向

    很多人都会被JavaScript中this的指向(也就是函数在调用时的调用上下文)弄晕,这里做一下总结: 首先,顶层的this指向全局对象. 函数中的this按照调用方法的不同,其指向也不同: 1.函 ...

  10. Linux Makefile 中的陷阱【转】

    转自:https://blog.csdn.net/QQ1452008/article/details/52247944 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog. ...