Java SE8 是2014年发布的。其重要特性包括 lambda表达式、stream、functional 接口以及时间类API。
本文针对以上特性,通过示例行解释说明。
1 lambda
2 functional
3 Streams
4 Date/Time API
1 Lambda表达式
从编程角度看,lambda表达式就是匿名函数。JavaScript的ajax callback很好的体现lambda的使用。
只不过不像JavaScript需要声明function。 其典型的使用如下:
(x, y)->x+y
使用的类、或方法是什么都不重要,重要的是接收2个参数,返回和值。
lambda的语法如下:
(parameters) -> expression
(parameters) -> { statements; }
() -> expression
一些示例:
(int a, int b)->a*b //接收2个整型,返回乘积
(a, b)->a-b //接收2个数值型,返回差值
()->99 //无接收参数,返回常量
(String a)->System.out.println(a) //接收字符串并打印输出
a-> 2*a //接收1个数值型,返回2倍该值
c->{ /*复杂处理*/ } //接收一个变量,进行逻辑处理
通过语法和示例可见lambda有以下一些特点:
1 可以接收0、1、或多个参数
2 参数的类型可以指定,也可以不指定。不指定时通过上下文决定。
3 单个参数可以不加括号。无参数、或多个参数需要加括号
4 body可以包含单个、或多个表达式。当只有一个的时候可以不加括号。
5 当body是一个表达式,结果是返回值不加return
2 Functional Interface
功能接口,内部有且仅有一个抽象方法,这里所说的不包括Object对象中的toString()和equals(Object obj)方法。如下示例:
@FunctionalInterface
public interface MyFirstFunctionalInterface{
void firstWrok();
}
注意,声明@FunctionalInterface不是一定要有的,仅用于编译约束。 另外,接口内也可以有默认实现,方法通过default进行修饰
示例:
public interface Moveable {
default void move(){
System.out.println("I am moving");
}
}
public class Animal implements Moveable{
public static void main(String[] args){
Animal tiger = new Animal();
tiger.move();
}
}
jdk中java.util.function提供了多种功能接口,如Function、Consumer、Supplier等等。
3 Stream
另一个较大的改进是java 8提供了streams api, 可以对集合数据进行过滤,转换等各种流式操作。 java8之前如果要删除list中某些特别的的对象,需要额外定义临时存储,进行查找后再删除。 stream方式支持直接过滤掉得到符合条件的数据。
示例1:
List<String> items= Arrays.asList("abdc","acbb","abae","aebc");
String prefix = "ab";
List<String> filteredList = items.stream().filter(e -> (!e.startsWith(prefix))).collect(Collectors.toList());
结果:[acbb, aebc]
示例2:
List<String> alphabets = Arrays.asList("a","b","b","d");
alphabets.forEach(l-> System.out.print(l.toUpperCase()));
结果: ABBD
stream结合lambda表达式可以很到程度简化代码量,并且具有较强的可读性。
4 Date/Time API
1)Date 类本版本基本废弃使用,由LocalDate,LocalTime 和 LocalDateTime替代, 表示本地时间日期。
LocalDate:仅表示日期,不包含时间和时区
LocalTime: 仅表示时间,不包括日期和时区
LocalDateTime: 表示日期时间,不包括时区
如果需要包含时区,可以使用 OffsetTime, OffsetDateTime. 时区偏移可以通过ZoneId获得。
2)表示绝对时间的类是:Instant
Instant提供了多种计算时间的静态方法
Instant instant = Instant.now();
Instant instant1 = instant.plus(Duration.ofMillis(5000));
Instant instant2 = instant.minus(Duration.ofMillis(5000));
Instant instant3 = instant.minusSeconds(10);
3)计算时间差值提供了 Duration 和 Period。
Duration用来计算很短的时间差,要求有较高的精度:
Duration duration = Duration.ofMillis(5000);
duration = Duration.ofSeconds(60);
duration = Duration.ofMinutes(10);
Period用来计算日期差:
Period period = Period.ofDays(6);
period = Period.ofMonths(6);
period = Period.between(LocalDate.now(), LocalDate.now().plusDays(60));