JAVA8新功能
主要包含:
- Lambda 表达式 、方法引用、函数式接口和 默认方法。
最大改进是 在java语言和平台支持Lambda 表达式。
- 日期和时间API
新的api使开发者用更自然,清楚,简单的方式处理日期和时间。
- Nashhorn JavaScript 引擎
新的轻量级,高性能JavaScript引擎
1. Lambda 表达式
用过其它常用语言(scala .net等)的开发者,应该比较熟悉Lambda表达式,在Java语言中Lambda就是一个匿名方法,匿名方法没有名称 标识,只在需要的时候创建,经常作为其他方法的参数。
Lambda基本格式是
(parameters) -> expression
或者
(parameters) -> { statements; }
或者
() -> expression
或者
x-> expression
典型例子:
(x, y) -> x + y //返回 x加上y的值
(String s) -> System.out.print(s) // 接受一个 string 对象,并在控制台打印
2. 函数式接口
函数式接口是指 只有一个抽象方法的接口或者类, 批注@FunctionalInterface表示这个是一个函数式接口,如果没有满足上面条件,编译器会报错。
例子:
@FunctionalInterface
public interface MyFirstFunctionalInterface{
void method();
}
java.util.function 类库下面 增加了很多函数式接口类
- 后缀是Predicate 表示只有一个输入 返回时boolean类型函数式接口。
- Function 接收一个参数 返回一个结果
- Supplier 没有参数 返回一个结果
- Consumer 有一个参数,没有结果
- 已Bi开头表示有两个参数的函数式
3.默认方法
java8为了支持lambda 表达式兼容旧代码,可以在接口里面定义默认方法并且有body实现.
默认方法有点违反接口的定义原则。接口里面混入实现代码。
例子:
public interface Moveable {
default void move(){
System.out.println("I am moving....");
}
}
4.Stream流
Stream提供一种机制来操作一个数据集。
操作包括 过滤 排序 映射 收集 转换等, filter sort map distinct limit count collect summaryStatistics...
数据集来源:可以是集合 、数组、IO Channel、generator 产生器等。
Stream通过管道串联在一起,通过访问者模式实现对每一个元素操作
例子:
List<string>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
int count = strings.stream().filter(string -> string.isEmpty()).count();
/<string>
parallelStream 可以返回并行流,很容易实现并发操作。
5.日期时间api
新增 java.time类库,旧的Date不是线程安全、结构混乱等已经舍弃。新增三个时间类 LocalDate, LocalTime and LocalDateTime.
例子:
LocalDateTime currentTime = LocalDateTime.now();//默认时区
System.out.println("当前时间: " + currentTime);
谈论日期必须带上时区否则就是耍流氓。时间戳不需要时区。
Timestamp Duration 和 Instant 持续时间 。
例子
Instant instant = Instant.now();
Instant instant1 = instant.plus(Duration.ofMillis(1000));
Duration duration = Duration.ofMillis(5000);
duration = Duration.ofMinutes(10);
JAVA8的这些新特性有提高你的生产力吗?
更多资源请参考jdk文档
閱讀更多 開源項目分享 的文章
關鍵字: Java 匿名 JavaScript