装weblogic的时候,发现不同的jdk版本对程序的应用有很大的关系。而jdk8添加的新特性中最显著的就是λ表达式,这倒是比C#慢了一步。
λ表达式的主要目的是加大代码的重构。先看一下,目标代码的结构图(图看不了的话,就当没有吧),免得来回翻动麻烦。
首先将官方的例子在开发环境中跑跑一会儿。例子的源程序这里就直接免了,需要的话,可以到官方的例子中去下载。
首先,lamda表达式的长相很奇怪。它用“->”表示。其次,它的表达体可以是一个语句块{...},也可以是一个可以计算结果的表达式。在lamda表达式中对象的使用让人感觉很突兀和很奇怪。因为lamda表达式中使用的对象不需要提前在程序中定义和声明,他只是在使用的时候将目标对象转成它需要的对象。例如:
方法的使用:
processPersons(
roster,
p -> p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25,
p -> p.printPerson()
);
在使用的时候p->...在前面既没有定义也没有声明,突然出现的,似乎是从天而降,不着边际。其实,在程序编译的时候默认的将你的p转变成Predicate<T> ,Consumer<T>中的泛型的数据类型。
publicstaticvoidprocessPersonsWithFunction(
List<Person> roster,
Predicate<Person> tester,
Function<Person, String> mapper,
Consumer<String> block) {
for (Person p : roster) {
if (tester.test(p)) {
String data = mapper.apply(p);
block.accept(data);
}
}
}
Lamda表达式的执行时机是,当程序调用 Predicate,Consumer,Function对象的一些方法时被执行。这一点,可以通过程序跟踪测试,也可以通过eclipse的调试工具测试。
Lamda表达式中一些陌生的数据类型的常用方法:
Predicate test(),估计给定的lamda表达式是不是符合预测。给我的感觉是这就像是java的测试工具中的断言。
Function apply(),调用“->”右边的表达式的内容,一般是一个对象的方法。
Consumer accept(),检测给定的参数类型,并将其放到程序块中执行。
以上的数据类型都是用于存放lamda表达式的数据类型,而后面的方法则是lamda表达式执行的地方。
注意:在lamda表达式中最好不要进行对原有的对象的数据类型的改变,其中的数据改变可能达不到你的预期效果。Lamda表达式的主要意图是将一段代码(lamda表达式体)当成一个参数来传递行为,而不仅仅只是值,方便代码重构,也增加代码的可读性。可以理解为做了一点预处理。在我的运行的代码中,Lamda表达式修改引用的值不能达到预期的效果,但是也不是像多线程不同同步的时候,出现的结果是不可预测的一样。这个留着吧。再者,很多以前用匿名对象情况,改用lamda表达式一般都会方便一些,特别是只实现了一个接口的匿名对象。