Java8-lambda表达式
拥抱函数式编程
每有新技术出现(虽然Java8已经远远谈不上新了),伴随而来的总是新造的一堆词,但是新词往往可以恰当的表达新技术的特性,所以我们从学习概念,再研究lambda。
概念
命令式编程、声明式编程、函数式编程
一.命令式编程的主要思想是关注计算机具体执行的步骤,即一步一步告诉计算机先做什么再做什么。例如Java等高级语言。
二.声明式编程是以数据结构的形式来表达程序执行的逻辑。它的主要思想是告诉计算机应该做什么,但不指定具体要怎么做。典型例子是sql,html。与命令式编程之间的差别是:
- 不需要创建变量来存储数据
- 不包含流程控制语句,像while等
三.函数式编程和声明式编程是有所关联的,因为他们思想是一致的:即只关注做什么而不是怎么做。但函数式编程不仅仅局限于声明式编程。
函数式编程最重要的特点是“函数第一位”,即函数可以出现在任何地方,比如你可以把函数作为参数传递给另一个函数,不仅如此你还可以将函数作为返回值。这种传递函数的操作也称为行为参数化。大部分常见的编程语言一半都已经提供了对这种编程方式的支持,比如 JavaScript,再有 C# 中的 LINQ 和 Java 中的 Lambda 和闭包的概念。
回调方法
在将来某个条件达成的情况下 会自动触发的方法,叫做回调方法.
比如java8提供了很多函数式接口,其中的方法实现就是回调方法.
行为参数化
行为一般存在于方法中,行为参数化的意思类似于模仿方法模式或策略模式,将主要的,频繁改变的行为封装成参数,传入母方法内.行为参数化对于应对不断变化的需求是一种很好的解决方案.
定义:让方法接受多种行为作为参数,并在内部使用,来完成不同的行为
Why Lambda?
-
有了行为参数化这种思想,我们将不同的实现放在不同的实现类中,将他们的共同接口传递给母方法.调用母方法时,实例化相应的实现类就可以实现灵活的策略模式.但是这种方式有一个弊端:实例化了很多只使用一次的对象
-
通过匿名类可以解决这个问题,但是创建匿名类的代码啰嗦,有很多模板代码,我们想要的抽象方法的实现只占代码的一小部分.
-
用lambda表达式优化匿名类,抽取出方法实现.代码变得前所未有的简约优雅。简约,却不简单。
-
lambda并没有改变任何东西,但是他又改变了所有东西.理论上来说,在java8之前做不到的事,lambda也做不到;但是能做到的事,lambda能做的更好.
-
反向思考,要理解不熟悉的lambda表达式的作用,要追根溯源去看他实现的接口被用在哪个方法中,方法的作用,所以lambda的可读性