Atitit.jdk java8的语法特性详解 attilax 总结
1.1. 类型推断这个特别有趣的、鲜为人知的特性1
2. Lambda1
2.1. 内部迭代意味着改由Java类库来进行迭代,而不是客户代码。例如:1
2.2. Stream 流失接口 管道(pipelines)模式2
2.3. 方法引用(Method reference)2
2.4. 默认方法(Default method)2
2.5. 生成器函数(Generator function)2
2.6. 新加入的Nashorn引擎也使得Java程序可以和JavaScript代码互操作3
3. reef3
1.1. 类型推断这个特别有趣的、鲜为人知的特性
2. Lambda在Java中,随声明随调用的方式是不行的,比如下面这样,声明了一个λ表达式(x, y) -> x + y,同时企图通过传入实参(2, 3)来调用它:
int five = ( (x, y) -> x + y ) (2, 3); // ERROR! try to call a lambda in-place
这在C++中是可以的,但Java中不行。Java的λ表达式只能用作赋值、传参、返回值等。
使用它设计的代码会更加简洁。当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口。
Java 8 引入的一个核心概念是函数式接口。如果一个接口定义个唯一一个抽象方法,那么这个接口就成为函数式接口。
2.1. 内部迭代意味着改由Java类库来进行迭代,而不是客户代码。例如:
集合类(包括List)现在都有一个forEach方法,对元素进行迭代(遍历),所以我们不需要再写for循环了。forEach方法接受一个函数接口Consumer做参数,所以可以使用λ表达式。
2.2. Stream 流失接口 管道(pipelines)模式
2.3. 方法引用(Method reference)
任何一个λ表达式都可以代表某个函数接口的唯一方法的匿名描述符。我们也可以使用某个类的某个具体方法来代表这个描述符,叫做方法引用。例如:
Integer::parseInt //静态方法引用
System.out::print //实例方法引用
Person::new //构造器引用
2.4. 默认方法(Default method)
Java8中,接口声明里可以有方法实现了,叫做默认方法。在此之前,接口里的方法全部是抽象方法。
这实际上混淆了接口和抽象类,但一个类仍然可以实现多个接口,而只能继承一个抽象类。
这么做的原因是:由于Collection库需要为批处理操作添加新的方法,如forEach(),stream()等,但是不能修改现有的Collection接口——如果那样做的话所有的实现类都要进行修改,包括很多客户自制的实现类。所以只好使用这种妥协的办法。
2.5. 生成器函数(Generator function)
有时候一个流的数据源不一定是一个已存在的集合对象,也可能是个“生成器函数”。一个生成器函数会产生一系列元素,供给一个流。Stream.generate(Supplier<T> s)就是一个生成器函数。其中参数Supplier是一个函数接口,里面有唯一的抽象方法 <T> get()。
下面这个例子生成并打印5个随机数:
Stream.generate(Math::random).limit(5).forEach(System.out::println);
注意这个limit(5),如果没有这个调用,那么这条语句会永远地执行下去。也就是说这个生成器是无穷的。这种调用叫做终结操作,或者短路(short-circuiting)操作。
2.6. 新加入的Nashorn引擎也使得Java程序可以和JavaScript代码互操作
3. reef