人生倒计时
- 今日已经过去小时
- 这周已经过去天
- 本月已经过去天
- 今年已经过去个月
什么是表达式?
表达式可以理解为表达可传递匿名函数的一种简洁方式:它没有名称,但它有一个参数列表、一个函数体、一个返回类型,可能还有一个可以抛出的异常列表。
例如传统的new写法如下
那么表达式的使用写为
->左边是参数列表,->右边是函数体
功能界面
为什么用@注解修饰的类只能有一个抽象函数
看Java8的源码,@修饰的函数称为函数式接口。例如,这些类往往只有一个抽象函数,那是因为“表达式被理解为简洁地表示可传递的匿名函数”,而直接使用的匿名函数在使用函数时并没有指定函数名。因此,如果有两个或多个抽象函数,虚拟机不知道要执行哪个方法。对于上例中的run()方法java lambda 方法引用,我们只使用了(),并没有声明要调用的函数名。
JDK自带的功能接口都在java.util中。路径,常用的有
函数式接口使用示例
其他功能接口使用示例
为什么使用局部变量的表达式必须是final的?
表达式体除了使用参数列表的数据外,还可以使用表达式外的局部变量,但是这些局部变量只能声明一次,否则会报错。
因为表达式体可以看作是一个匿名的内部类,所以对外部局部变量的访问需要是final的。从线程的角度来看,局部变量是一个线程(假设它被称为线程A),而表达式的主体是另一个线程(线程B)。当线程A结束时,线程B也需要访问线程A的数据。不,所以线程B中的变量实际上并不是指向线程A中的变量,而是一个副本,所以必须保证复制的数据不能改变。
方法参考
表达式还有一个很方便的地方,就是方法引用,可以直接以类名::方法名的形式使用。
例如
复合表达式的使用
表达式也可以被链接起来,并具有 AND 或 NOT (, and and or) 的逻辑判断
功能构成
函数接口提供了两种对数据进行连续操作的方法和方法。
方法相当于先执行f函数java lambda 方法引用,再执行g函数。
方法相当于先执行g函数,再执行f函数。