最近在学习java8,所以接下来会给大家介绍一系列的java8学习内容,那么让我们先从λ表达式开始。
众所周知从java8出现以来λ是最重要的特性之一,它可以让我们用简洁流畅的代码完成一个功能。很长一段时间java被吐槽是冗余和缺乏函数式编程能力的语言,随着函数式编程的流行java8种也引入了这种编程风格。在此之前我们都在写匿名内部类干这些事,但有时候这不是好的做法,本文中将介绍和使用λ,带你体验函数式编程的魔力。
可运行r=新Runnable () { @Override 公共空间run () { system . out。println(“做点什么。”); } }
也有人会写一个类去实现运行的接口,这样做没有问题,我们注意这个接口中只有一个运行方法,当把Runnable对象给线程对象作为构造参数时创建一个线程,运行后将输出<代码>做点什么。> 代码。我们使用匿名内部类的方式实现了该方法。
这实际上是一个代码即数据的例子,在运行方法中是线程要执行的一个任务,但上面的代码中任务内容已经被规定死了。当我们有多个不同的任务时,需要重复编写如上代码。
设计匿名内部类的目的,就是为了方便Java程序员将代码作为数据传递,不过,匿名内部类还是不够简便,为了执行一个简单的任务逻辑,不得不加上6行冗繁的样板代码。那如果是λ该怎么做& # 63;
可运行r=()→system . out。println(“做点什么。”);
嗯,这代码看起来很酷,你可以看到我们用()和→的方式完成了这件事,这是一个没有名字的函数,也没有人和参数,再简单不过了。使用→将参数和实现逻辑分离,当运行这个线程的时候执行的是→之后的代码片段,且编译器帮助我们做了类型推导,这个代码片段可以是用{}包含的一段逻辑。下面一起来学习一下λ的语法。
在λ中我们遵循如下的表达式来编写:
表达=(变量)→行动
-
<李>变量:这是一个变量,一个占位符。像x, y, z,可以是多个变量。李>
<李>行动:这里我称它为行动,这是我们实现的代码逻辑部分,它可以是一行代码也可以是一个代码片段李>
可以看到表达式的格式:参数,箭头,以及动作实现,当一个动作实现无法用一行代码完成,可以编写一段代码用{}包裹起来。
<强>λ表达式可以包含多个参数,例如:强>
int金额=(x, y)→x + y;
这时候我们应该思考这段代码不是之前的x和y数字相加,而是创建了一个函数,用来计算两个操作数的和。后面用int类型进行接收,在λ中为我们省略去了回来。
函数式接口是只有一个方法的接口,用作λ表达式的类型。前面写的例子就是一个函数式接口,来看看jdk中的Runnable源码
@FunctionalInterface 公共接口可运行{/* * *当一个对象实现的接口& lt; code> Runnable使用 *创建一个线程,线程对象的原因 * & lt; code> run</code>将被调用的方法分别执行 *线程。 * & lt; p> *方法的总承包合同& lt; code> run是,它可能 *采取任何行动。 * * @see java.lang.Thread # run () */公共抽象空运行(); }
这里只有一个抽象方法,实际上你不写<代码> <你>公共抽象 代码>也是可以的,在接口中定义的方法都是公共抽象的。同时也使用注解<代码> @FunctionalInterface 代码>告诉编译器这是一个函数式接口,当然你不这么写也可以,标识后明确了这个函数中只有一个抽象方法,当你尝试在接口中编写多个方法的时候编译器将不允许这么干。
我们来编写一个函数式接口,输入一个年龄,判断这个人是否是成人。
公开课FunctionInterfaceDemo { @FunctionalInterface 接口PredicateJava8深入学习系列(一)λ表达式介绍