Java函数式编程(二)
- 2020 年 4 月 2 日
- 筆記
前言
如果你对Lambda表达式感兴趣,想知道它怎么帮助你提升专业技能,那么,看到这篇文章就对了!我们假设大家还不知道Lambda表达式,以及Java的核心类库的变化,我们将从“零”开始介绍这些概念、类库和技术。
Standing on Shoulders of Giants
站在巨人的肩膀上
Why?

• 如何编写出简单、干净、易读的代码——尤其是对于集合的操作?
• 如何简单地使用并行计算提高性能?
• 如何准确的为问题建模,并且开发出更好的领域特定语言?
• 如何写出不易出错,并且更简单的并发代码?
• 如何测试和调试Lambda 表达式?
我一猜,你们就不知道!!!


其实,我也不太清楚,哈哈,开个玩笑!我们的文章主要面向那些已经掌握了Java SE,并且想尽快了(掌)解(握)Java新特性的开发人员。当然了,如果你是初学者也没关系,多了解了解,也可以提升编程思想(装逼)!


如何辨别Lambda表达式

Lambda表达式除了基本的形式之外,还有几种变体,如:
Runnable noArguments = () -> System.out.println("Hello World"); ActionListener oneArgument = event -> System.out.println("buttom clicked"); Runnable multiStatement = () -> { System.out.print("Hello"); System.out.println(" World"); }; BinaryOperator<Long> add = (x , y) -> x + y; BinaryOperator<Long> addExplicit = (Long x, Long y) -> x + y;
上面第一行所示的Lambda表达式不包含参数,使用空括号()表示没有参数。该Lambda表达式实现了 Runnable 接口,该接口也只有一个 run 方法,没有参数,且返回类型为 void。
第二行所示的Lambda表达式包含且只包含一个参数,可省略参数的括号,这和我们在上一期讲的形式是一样的哦!
当然了,Lambda表达式的主体不仅可以是一个表达式,而且也可以是一段代码块,使用大括号({})将代码块括起来。
目标
类型
目标类型是指Lambda表达式所在上下文环境的类型。比如,将Lambda表达式赋值给一个局部变量,或传递一个方法作为参数,局部变量或方法参数的类型就是Lambda表达式的目标类型。

隐含意思
Lambda表达式的类型依赖于上下文环境,是由编译器推断出来的。目标类型也不是一个全新的概念。Java中初始化数组时,数组的类型就是根据上下文推断出来的。另一个常见的例子时null,只有将null赋值给一个变量,才能知道它的类型。比如下面这个Demo。
(等号右边的代码并没有声明类型,系统根据上下文推断出类型信息)
final String[] array = { "Hello", "world" };
好吧,今天就说到这,码字排版真的很辛苦,Java函数式编程系列我们一周只更一期哦,尽请期待下周吧!『下周关键词:引用值,而不是变量』,没错,我们从第二期开始做了一些细小的改动。。。
每周小结
• Lambda表达式的常见结构:BinaryOperator<Integer> add = (x, y) → x + y;
每周名言
• 编程可以很有趣,你可以用它做密码学研究,但两者绝对不能合二为一。(Kreitzberg and Shneiderman)
每周问答
• 问 :为什么JAVA文件中只能含有一个Public类?
• 答 :java 程序是从一个 public 类的 main 函数开始执行的,(其实是main线程),就像 C 程序 是从 main() 函数开始执行一样。 只能有一个public 类是为了给类装载器提供方便。 一个 public 类只能定义在以它的类名为文件名的文件中。每个编译单元(文件)都只有一个 public 类。因为每个编译单元都只能有一个公共接口,用 public 类来表现。该接口可以按照要求包含众多的支持包访问权限的类。如果有一个以上的 public 类,编译器就会报错。 并且 public类的名称必须与文件名相同(严格区分大小写)。 当然一个编译单元内也可以没有 public 类。