最近学Java遇到了一些java8的新特性记录一下我根据比较频繁的
1 Lambda表达式
Lambda的设计耗费了很多时间和很大的社区力量,最终找到一种折中的实现方案,可以实现简洁而紧凑的语言结构。最简单的Lambda表达式可由逗号分隔的参数列表、->符号和语句块组成,例如:
Arrays.asList( “a”, “b”, “d” ).forEach( e -> System.out.println( e ) );
如果Lambda表达式需要更复杂的语句块,则可以使用花括号将该语句块括起来,类似于Java中的函数体,例如:
Arrays.asList( “a”, “b”, “d” ).forEach( e -> {
System.out.print( e );
System.out.print( e ); } );
2 @FunctionalInterface注解
什么是函数式接口(Functional Interface)
其实之前在讲Lambda表达式的时候提到过,所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法。这种类型的接口也称为SAM接口,即Single Abstract Method interfaces。
Java 8为函数式接口引入了一个新注解@FunctionalInterface,主要用于编译级错误检查,加上该注解,当你写的接口不符合函数式接口定义的时候,编译器会报错。
正确例子,没有报错:
@FunctionalInterface interface GreetingService {
void sayMessage(String message); }
错误例子,接口中包含了两个抽象方法,违反了函数式接口的定义,Eclipse报错提示其不是函数式接口。
加不加@FunctionalInterface对于接口是不是函数式接口没有影响,该注解知识提醒编译器去检查该接口是否仅包含一个抽象方法
函数式接口里允许定义默认方法
函数式接口里是可以包含默认方法,因为默认方法不是抽象方法,其有一个默认实现,所以是符合函数式接口的定义的;
如下代码不会报错:
@FunctionalInterface interface GreetingService { void
sayMessage(String message);default void doSomeMoreWork1() {
// Method body }default void doSomeMoreWork2() {
// Method body } }
函数式接口里允许定义静态方法
函数式接口里是可以包含静态方法,因为静态方法不能是抽象方法,是一个已经实现了的方法,所以是符合函数式接口的定义的;
如下代码不会报错:
@FunctionalInterface
interface GreetingService
{
void sayMessage(String message);
static void printHello(){
System.out.println(“Hello”);
}
}
3 方法引用
第一种方法引用的类型是构造器引用,语法是Class::new,或者更一般的形式:Class::new。注意:这个构造器没有参数。
final Car car = Car.create( Car::new ); final List< Car > cars =Arrays.asList( car );
第二种方法引用的类型是静态方法引用,语法是Class::static_method。注意:这个方法接受一个Car类型的参数。
cars.forEach( Car::collide );
第三种方法引用的类型是某个类的成员方法的引用,语法是Class::method,注意,这个方法没有定义入参:
cars.forEach( Car::repair );
第四种方法引用的类型是某个实例对象的成员方法的引用,语法是instance::method。注意:这个方法接受一个Car类型的参数:
final Car police = Car.create( Car::new ); cars.forEach(
police::follow );
4 Streams
Stream(流)是一个来自数据源的元素队列并支持聚合操作
常常用于创建一个保存收集结果的集合,对传进来的集合进行遍历,通过特定的条件筛选,然后将筛选的结果添加到结果集并返回
filter 方法用于通过设置的条件过滤出元素。以下代码片段使用 filter 方法过滤出空字符串:
List strings = Arrays.asList(“abc”, “”, “bc”, “efg”,“abcd”,"", “jkl”);
List filtered =strings.stream().filter(string ->!string.isEmpty()).collect(Collectors.toList());
map 方法用于映射每个元素到对应的结果,以下代码片段使用 map 输出了元素对应的平方数:
List numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); //
获取对应的平方数 List squaresList = numbers.stream().map( i ->
i*i).distinct().collect(Collectors.toList());
Date/Time API(JSR 310)
Clock类使用时区来返回当前的纳秒时间和日期。Clock可以替代System.currentTimeMillis()和TimeZone.getDefault()。
System.out.println( clock.instant() ); System.out.println(
clock.millis() );
返回结果
2014-04-12T15:19:29.282Z
1397315969360
第二,关注下LocalDate和LocalTime类。LocalDate仅仅包含ISO-8601日历系统中的日期部分;LocalTime则仅仅包含该日历系统中的时间部分。这两个类的对象都可以使用Clock对象构建得到。
final LocalDate date = LocalDate.now();
final LocalDate dateFromClock = LocalDate.now( clock );
System.out.println( date );
System.out.println( dateFromClock );
final LocalTime time = LocalTime.now();
final LocalTime timeFromClock= LocalTime.now( clock );
System.out.println( time );
System.out.println( timeFromClock );
返回结果
2014-04-12 2014-04-12
11:25:54.568 15:25:54.568
未完待续。。。 错误请指教