Jdk8新特性
一:接口默认方法和静态方法:
我们可以在接口中定义默认方法,使用default关键字,并提供默认的实现。所有实现这个接口的类都会接受默认方法的实现,除非子类提供的自己的实现。 我们还可以在接口中定义静态方法,使用static关键字,也可以提供实现。例如:
public interface DefaultFunctionInterface {
default void defaultFunction() {
System.out.println("接口DefaultFunctionInterface中的default defaultFunction方法被调用...");
}
static void staticFunction() {
System.out.println("接口DefaultFunctionInterface中的静态方法staticFunction方法被调用...");
}
}
子类实现和调用demo:
public class DefaultFunctionInterfaceImpl implements DefaultFunctionInterface {
public static void main(String[] args){
DefaultFunctionInterfaceImpl dif = new DefaultFunctionInterfaceImpl();
dif.defaultFunction(); //子类调用父类接口中default方法
DefaultFunctionInterface.staticFunction();//调用接口中的静态方法
}
}
讨论java为什么要使用多继承? 接口允许default和static是否会有类似的情况?
二:Lambda表达式
首先来看看老版本的java是如排列字符串的(这里按照字符串的长度排序):
List<String> strs = Arrays.asList("A","AAAAAAAAAAA","AAA","AAAAAAAAA","AAAAA","AAAAAAAAAAAAA","AAAAAAA");
Collections.sort(strs, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
Integer l1 = o1.length();
Integer l2 = o2.length();
return l1.compareTo(l2);
}
});
只需要给静态方法 Collections.sort 传入一个List对象以及一个比较器来按指定顺序排列。通常做法都是创建一个 匿名内部类 的比较器对象然后将其传递给sort方法。在Java 8 中你就没必要使用这种传统的匿名对象的方式了,Java 8提供了更简洁的语法,lambda表达式:
List<String> strs = Arrays.asList("a","avgdeqegtrq","gcs","qwrgreqwh","hgtyu","qwerrtyuhjgfd","ghjkuyt");
Collections.sort(strs,(String o1,String o2)->{
Integer l1 = o1.length();
Integer l2 = o2.length();
return l1.compareTo(l2);
});
可读性变强了,但是实际上还可以写得更短(省略参数类型):
List<String> strs = Arrays.asList("a","avgdeqegtrq","gcs","qwrgreqwh","hgtyu","qwerrtyuhjgfd","ghjkuyt");
Collections.sort(strs,( o1, o2)->{
Integer l1 = o1.length();
Integer l2 = o2.length();
return l1.compareTo(l2);
});
运行结果都为:
对于函数体只有一行代码的,你可以去掉大括号{}以及return关键字,将代码写的更短,例如(这里就不按照字符串长度排序了):
List<String> strs = Arrays.asList("a","avgdeqegtrq","gcs","qwrgreqwh","hgtyu","qwerrtyuhjgfd","ghjkuyt");
Collections.sort(strs,(o1,o2)->o1.compareTo(o2));
__总结:
1.如果形参列表是空的,只需要保留()即可;
2.如果没有返回值,只需要在{}写执行语句即可;
3.如果接口的抽象方法只有一个形参,()可以省略,只需要写一个参数名称即可;
4.如果执行语句只有一行,可以省略{},但是如果有返回值的时候不能省略。
原理: Java编译器可以根据要传递的对象或者左边对象类型自动推导出参数类型,所以你可以不用再写一次类型,适用于只有单接口方法的接口(比如这里的排序,线程等...)__
三:函数式接口
是指仅仅只包含一个抽象方法的接口,可以添加 @FunctionalInterface 注解约束,编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的,当然里面可以包含default方法和static方法。
例如:
@FunctionalInterface
public interface DefaultFunctionInterface {
void sayHello(String name);
public static void main(String[] args){
DefaultFunctionInterface df = name->System.out.println("hello===>"+name);
df.sayHello("Bruce");
}
}
Jdk9新特性
jdk9 ea版本(early access 抢先版),下载地址:http://jdk.java.net/9/
一:JShell
JShell : 其实就是一个命令行工具,安装完JDK9后,可以在bin目录下找到该工具,与Python的解释器极其相似,用过Python解释器的人应该会非常熟悉。它可以让你体验交互式编程,有一些比较有趣的特性:
实战:
在jdk9安装目录的bin下面打开命令行工具,直接输入jshell进入jshell。
直接输入代码:System.out.println("Hello World"); 回车执行.输出"Hello World".
创建方法:void hello(){System.out.println("Hello 货车帮!");}
计算:输入1+1回车执行输出计算结果. 存储了一个临时变量,可以声明一个变量,利用这个临时变量给声明的变量赋值.
JShell除了可以作为单独的JDK工具,还可以创建类,为这个类写方法,还可以提供一个API,它能对外部调用开放所有的功能。这意味着外部工具可以连接并使用JShell的功能,如此一些很有趣的可能性突然就被开发了出来,比如在Eclipse、IntelliJ或Netbeans之类的IDE中引用它。对于该API可能还有更多创造性的用例,例如利用该API来扩展静态分析的工具,自动化测试或者甚至是连接到实时的JVM。
二:集合工厂方法(试了9ea版本好像还不行):
通常,您希望在代码中创建一个集合(例如,List 或 Set ),并直接用一些元素填充它。 实例化集合,几个 “add” 调用,使得代码重复。 Java 9,添加了几种集合工厂方法,除了更短和更好阅读之外,这些方法也可以避免您选择特定的集合实现:
Set<Integer> ints = Set.of(1, 2, 3);
List<String> strings = List.of("first", "second");
三:其他的一些新特性: 自带JSON API,升级HttpURLConnection(相当于自带httpclient) 和 modules(平台级模块系统)
.......