JDK1.8新特性知识点梳理
JDK1.8新特性知识点梳理
引言
由于刚刚换份工作,之前公司用的是JDk1.7,新公司用的JDK1.8,虽然之前对JDK1.8有过零零碎碎的了解,但是还是不是非常系统,今天乘着空余时间,梳理一下JDK1.8新增的一些特性!
特性详解
1.接口的默认方法(default
关键字)
开始学习之前,我们先看一段Iterable
接口源码
package java.util;
import java.util.function.Consumer;
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
在上面的代码中,我们看到接口实现了remove()
和forEachRemaining(Consumer<? super E> action)
方法;
而在实现类中可以选择实现default
方法,也可以不实现,实现的话就相当于覆写该方法,遵循Java多态的特性。
个人理解,在接口中使用default
关键字,实现了接口方法,相当于给该接口方法默认了一个模板实现,从而减少大量该方法的覆写,减少代码量!同时保持了接口的使用方式!
lambda表达式
在学习前,我们先看一段关于Runnable
接口的代码
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
public static void main(String[] args) {
//原始实现方式
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("简单的线程编程JDK1.8以前");
}
}).start();
//lambda实现方式
new Thread(()->{System.out.println("Lambda可读性强一些");}).start();
//lambda简洁版
new Thread(()->System.out.println("Lambda简洁一些")).start();
}
在·Runnable
接口中,只有run()
一个函数,且该函数没有参数,故而Runnable
实现的表达式是:
() -> System.out.println("简单的线程编程JDK1.8")
下面我们再看一个有参的lambda
的表达表达式实现方式
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
}
public static void testComparatorLambda(){
List<Integer> names = Arrays.asList(1, 10, 3, 2,1);
//原始实现方式
Collections.sort(names, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});
/***********************************************************************************/
//lambda实现方式
Collections.sort(names,(Integer o1,Integer o2)->{
return o1.compareTo(o2);
} );
//lambda简介方式
//Java编译器可以自动推导出参数类型,所以可以不用再写一次类型
Collections.sort(names,( o1, o2)->o1.compareTo(o2));
}
上面为lambda
带参数的实现方式:
Collections.sort(names,( o1, o2)->o1.compareTo(o2));
看完上面的示例,相信对lambda
的使用方式有了一个大致的了解,在这里我们要提出一个新的知识点函数式接口