lambda表达式入门

5 篇文章 0 订阅
2 篇文章 0 订阅

1.背景介绍

Java 是一门面向对象编程语言。面向对象编程语言和函数式编程语言中的基本元素(Basic Values)都可以动态封装程序行为:
面向对象编程语言使用带有方法的对象封装行为,函数式编程语言使用函数封装行为。
但这个相同点并不明显,因为Java 对象往往比较“重量级”:实例化一个类型往往会涉及不同的类,并需要初始化类里的字段和方法。
不过有些 Java 对象只是对单个函数的封装。不需要专门定义一个类来实现 ,因为它只会在调用处被使用一次。
编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。
所有使用接口的地方都可以Lambda表达式来进行简化,只是一个简单的替换而已。
“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,
直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。

2.知识剖析
lambda运算符:
所有的lambda表达式都是用新的lambda运算符 " -> ",可以叫他,“转到”或者 “成为”。
运算符将表达式分为两部分,左边指定输入参数,中间是箭头,右边是lambda的主体。
(参数类型 参数名)->{代码主体}
1.标准写法:(类型1 参数名1,类型2 参数名2...)->{代码块}
2.参数类型可以推断 :(参数名1,参数名2...)->{代码块}
3.存在多行代码 :(参数名1,参数名2...)->{代码行;--代码行}
4.单个参数并可推断类型 :(参数名1)->{代码块}
5.方法引用 :System.out::println
6,没有参数 :()->{代码块}
3.常见问题
lambda表达式与匿名内部类
lambda表达式与函数式接口

4.解决方案
匿名内部类
匿名内部类也就是没有名字的内部类
正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
PS:Lambda表达式并不能取代所有的匿名内部类,只能用来取代函数接口(Functional Interface)的简写。


函数式接口
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
任何接口,如果只包含唯一 一个抽象方法,那么它就是一个Functional Interface。
之前它们被称为 SAM类型,即 单抽象方法类型(Single Abstract Method)。
接口中的方法默认就是public abstract的。
函数式接口需要添加:@FunctionalInterface

5.编码实战
6.扩展思考
lambda表达式的性能问题
7.参考文献
文章作者:kangkaii
文章作者:CarpenterLee
8.更多讨论
1.用lambda表达式遍历循环 和传统法式 哪个性能比较好?
性能具体的变化,应该增加处理的计算量,使得测试结果的对比更加明显。
2.如果lambda只能使用一次,那么它的优势又有什么呢
一.lamada表达式简化了接口实现的过程,使得代码结构更加简洁。
二.lamada的使用非常灵活。
3.我们为什么需要Lambda表达式呢?
lambda表达式通过实现匿名类的方式对接口或者类进行了实例化,但是因为实例化的对象没有名字,也就无法进行二次使用,所以lambda表达式只能够使用一次,也就只能够使用或者执行一个方法。

简单讲就是:用lambda表达式构造方法实体,等价于实现了接口中的方法,最终lambda表达式的返回值就是接口的实现类



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值