接口的默认方法和静态方法
默认方法用default
修饰,默认方法和抽象方法之间的区别在于抽象方法需要实现,而默认方法不需要。接口提供的默认方法会被接口的实现类继承或者覆写。
如果有两个接口中的静态方法一模一样,并且一个实现类同时实现了这两个接口,此时并不会产生错误,因为jdk8只能通过接口类调用接口中的静态方法,所以对编译器来说是可以区分的。但是如果两个接口中定义了一模一样的默认方法,并且一个实现类同时实现了这两个接口,那么必须在实现类中重写默认方法,否则编译失败。
函数式接口
只有一个抽象方法的接口,用@FunctionalInterface
注解接口。
JDK8函数式接口Function、Consumer、Predicate、Supplier
Lambda表达式、方法引用
不赘述了,实现原理就是用了函数式接口。
重复注解
在注解类上添加@Repeatable
JDK8新特性之重复注解
反射获取方法中的参数名
使用反射API和Parameter.getName()
方法。
这个特性是默认关闭的,需要在javac编译的时候带上-parameters
package com.javacodegeeks.java8.parameter.names;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
public class ParameterNames {
public static void main(String[] args) throws Exception {
Method method = ParameterNames.class.getMethod( "main", String[].class );
for( final Parameter parameter: method.getParameters() ) {
System.out.println( "Parameter: " + parameter.getName() );
}
}
}
/**
* 不加-parameters: Parameter: arg0
* 加了-parameters: Parameter: args
*/
Optional
Optional是一个容器:存放T类型的值或者null。它提供了一些有用的接口来避免显式的null检查
Optional<String> fullName = Optional.ofNullable( null );
System.out.println( "Full Name is set? " + fullName.isPresent() );
System.out.println( "Full Name: " + fullName.orElseGet( () -> "[none]" ) );
System.out.println( fullName.map( s -> "Hey " + s + "!" ).orElse( "Hey Stranger!" ) );
/*
Full Name is set? false
Full Name: [none]
Hey Stranger!
*/
Optional< String > firstName = Optional.of( "Tom" );
System.out.println( "First Name is set? " + firstName.isPresent() );
System.out.println( "First Name: " + firstName.orElseGet( () -> "[none]" ) );
System.out.println( firstName.map( s -> "Hey " + s + "!" ).orElse( "Hey Stranger!" ) );
/*
First Name is set? true
First Name: Tom
Hey Tom!
*/
Streams
java8-stream-tutorial-examples
Streams API 详解
Date / Time
Clock
类使用时区来返回当前的纳秒时间和日期。Clock
可以替代System.currentTimeMillis()
和TimeZone.getDefault()
。
// Get the system clock as UTC offset
final Clock clock = Clock.systemUTC();
clock = Clock.systemDefaultZone();
System.out.println( clock.instant() );
System.out.println( clock.millis() );
System.out.println(ZoneId.getAvailableZoneIds());
ZoneId zone = ZoneId.of("Asia/Shanghai");
LocalTime now = LocalTime.now(zone);
System.out.println(now);
// 16:50:27.527
LocalTime late = LocalTime.of(23, 59, 59);
System.out.println(late);
// 23:59:59
LocalDate today = LocalDate.now();
LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS);
LocalDate yesterday = tomorrow.minusDays(2);
LocalDate independenceDay = LocalDate.of(2018, Month.JULY, 4);
DayOfWeek dayOfWeek = independenceDay.getDayOfWeek();
System.out.println(dayOfWeek); // WEDNESDAY
JVM
使用Metaspace
代替持久代(PermGen space
)。在JVM参数方面,使用-XX:MetaSpaceSize
和-XX:MaxMetaspaceSize
代替原来的-XX:PermSize
和-XX:MaxPermSize
。
网友评论