本文首发:
Java-函数式编程(二)Lambda表达式

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

认识lambda

    public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类的执行");
}
}).start();
}

  

设计匿名内部类的目的,就是为了方便程序猿将代码作为数据来传递。但是你会发现,这个对象看起来是很多余的,所以我们不想传入对象,只想传入行为。

new Thread(()->{
System.out.println("lambda代替内部类");
}).start();

  

和实现某接口的对象不同,我们传入了一段代码块--一个没有名字的函数。->将参数和表达式主体分开,左边是参数,右边是方法体。

Lambda的不同形式

Runnable runnable =  ()-> System.out.println("hello world");

 

该Lambda表达式不包含参数(因为是空括号)。

interface Test{
void oneParam(String name);
} Test test = s -> System.out.println("oneParam方法传递参数:"+s);
test.oneParam("我是传递的值");

  

控制台输出:
oneParam方法传递参数:我是传递的值

  

(lambda只能用于函数式接口),如果参数只包含一个参数,可以省略参数的括号。

interface Test2{
int add(int a,int b);
}
Test2 test2 = (x,y) -> x+y;
int add = test2.add(10, 10);
System.out.println(add);

控制台输出:
20

可以看到,我们在使用lambda的时候创建了一个函数x+yTest2对象不是表示两个数字的和,而是表示两个数字相加的代码。以上的代码中,参数类型都是由编译器自己推断的,同样,我们可以明确的声明参数类型:

interface Test3{
long add(long a,long b);
} Test3 test3 = (long x,long y) -> x+y;
long add = test3.add(10, 10);

  

引用值的要求

Error:(25, 64) java: 从lambda 表达式引用的本地变量必须是最终变量或实际上的最终变量

String  name = "FantJ";
Runnable runnable = ()-> System.out.println("hello " +name);
runnable.run();
hello FantJ

上面这段代码,Lambda可以引用非final变量这个属性你可以早已了解,但是你更需要知道,java8只是放松了这一语法的限制,但实际上要求该变量还是final。

可以看到,不管name在使用lambda的前还是后做改动,lambda都会报错:表达式引用的本地变量必须是最终变量或实际上的最终变量,简单的,我们可以称他为既成事实上的final变量。所以,lambda也被称为闭包。

Lambda表达式类型

java中,所有方法都有返回类型,那lambda返回类型是什么呢。

是接口方法的返回类型。这一点前文有体现过。这里再详细解释下。

interface Test{
void oneParam(String name);
}

拿这个例子来讲,oneParam方法表示一种行为:接受一个String,返回void。只要方法名和行为和Lambda表达式匹配即可完成调用。

注意:如果编译器猜不出参数和返回值的类型,则都将视为Object处理。

Java-函数式编程(二)Lambda表达式的更多相关文章

  1. Java 函数式编程(Lambda表达式)与Stream API

    1 函数式编程 函数式编程(Functional Programming)是编程范式的一种.最常见的编程范式是命令式编程(Impera Programming),比如面向过程.面向对象编程都属于命令式 ...

  2. Java函数式编程和lambda表达式

    为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做.说白了,函数式编程是基于 ...

  3. Java 函数式编程和Lambda表达式

    1.Java 8最重要的新特性 Lambda表达式.接口改进(默认方法)和批数据处理. 2.函数式编程 本质上来说,编程关注两个维度:数据和数据上的操作. 面向对象的编程泛型强调让操作围绕数据,这样可 ...

  4. java函数式编程之lambda表达式

    作为比较老牌的面向对象的编程语言java,在对函数式编程的支持上一直不温不火. 认为面向对象式编程就应该纯粹的面向对象,于是经常看到这样的写法:如果你想写一个方法,那么就必须把它放到一个类里面,然后n ...

  5. Java函数式接口与Lambda表达式

    什么是函数式接口? 函数式接口是一种特殊的接口,接口中只有一个抽象方法. 函数式接口与Lambda表达式有什么关系? 当需要一个函数式接口的对象时,可以提供一个lambda表达式. package l ...

  6. Java8函数式编程和lambda表达式

    文章目录函数式编程JDK8接口新特性函数接口方法引用函数式编程函数式编程更多时候是一种编程的思维方式,是一种方法论.函数式与命令式编程区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉 ...

  7. Java8函数式编程以及Lambda表达式

    第一章 认识Java8以及函数式编程 尽管距离Java8发布已经过去7.8年的时间,但时至今日仍然有许多公司.项目停留在Java7甚至更早的版本.即使已经开始使用Java8的项目,大多数程序员也仍然采 ...

  8. Python函数式编程:Lambda表达式

    首先我们要明白在编程语言中,表达式和语句的区别. 表达式是一个由变量.常量.有返回值的函数加运算符组成的一个式子,该式子是有返回值的 ,如  a + 1 就是个表达式, 单独的一个常量.变量 或函数调 ...

  9. C# 函数式编程 —— 使用 Lambda 表达式编写递归函数

    最近看了赵姐夫的这篇博客http://blog.zhaojie.me/2009/08/recursive-lambda-expressions.html,主要讲的是如何使用 Lambda 编写递归函数 ...

  10. 函数式编程--使用lambda表达式

    前面一篇博客我们已经说到了,lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口的实例.现在我们来写一段java的命令者模式来自己研究下lambda表达式的语法. 这里重复下命令者模式: ...

随机推荐

  1. [BeiJing wc2012]连连看(建模,最小费用最大流)

    前言 突然发现自己在图论①被dalao吊着打... Solution 看到数据范围1000,感觉可以直接枚举连边,然后新建两个点就好了. 注意要拆点,不然可能会死循环(过来人) 代码实现 #inclu ...

  2. 【062有新题】OCP 12c 062出现大量之前没有的新考题-16

    choose one Which users are created and can be used for database and host management of your DBaaS da ...

  3. 2018 Multi-University Training Contest 6

    A.oval-and-rectangle 题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6362 题意:在长半轴为a,短半轴为b的椭圆内部,以y=c( ...

  4. 【hyperscan】示例解读 pcapscan

    示例位置: <hyperscan source>/examples/pcapscan.cc参考:http://01org.github.io/hyperscan/dev-reference ...

  5. Vue 项目配置

    配置Vue的app项目首先需要配置本地环境. 1.下载node.js并且安装.(根据自己电脑参数进行选择) 打开cmd,检查是否安装成功. 分别输入: node -v npm -v 结果如图正确显示出 ...

  6. WebRTC开发基础(WebRTC入门系列3:RTCDataChannel)

    除了视频和音频,webRTC还可以传输其他数据 例子: http://webrtc.github.io/samples/src/content/datachannel/datatransfer/ 应用 ...

  7. Python中Flask框架SQLALCHEMY_ECHO设置

    在用配置类的方式给app设置配置时, SQLALCHEMY_ECHO 这个是记录打印SQL语句用于调试的, 一般设置为False, 不然会在控制台输出一大堆的东西 /home/python/.virt ...

  8. Ubutntu安装docker启动报Removed /etc/systemd/system/docker.service.

    Ubutntu安装docker启动报Removed /etc/systemd/system/docker.service.的错误,只需要执行以下三条命令. systemctl unmask docke ...

  9. Metasploit中数据库的密码查看以及使用pgadmin远程连接数据库

    我们都知道,在msf下进行渗透测试工作的时候,可以将结果数据保存到数据库中,方便各个小组成员在渗透测试过程中的数据同步. 例如,Metasploit提供了db_nmap命令,它能够将Nmap扫描结果直 ...

  10. 计划任务crond服务

    什么是计划任务:后台运行,到了预定的时间就会自动执行的任务,前提是:事先手动将计划任务设定好.这就用到了crond服务 crond服务相关的软件包[root@MiWiFi-R3-srv ~]# rpm ...