Java9新特性系列(Java9新特性系列(Stream改进))
Java8的Stream
在Java8中,一个比较大的变化就是流(Stream),具体可以看之前的一篇文章:Java8新特性系列(Stream)
在Java8中,一个比较大的变化就是流(Stream),具体可以看之前的一篇文章:Java8新特性系列(Stream)
在Java8版本以前,创建一个只读不可变的集合,先要初始化,然后塞数据,然后置为只读:
1 | Set<String> set = new HashSet<>(); |
上面的方式占用太多行,能不能用单行表达式呢?用如下方式:
1 | Set<String> set = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("a", "b", "c"))); |
在Java8中可以用流的方法创建,具体可以看之前的一篇文章Java8新特性系列(Stream),实现方法如下:
1 | Set<String> set = Collections.unmodifiableSet(Stream.of("a", "b", "c").collect(toSet())); |
在Java7之前每次声明泛型变量的时必须左右两边都同时声明泛型:
1 | List<String> list = new ArrayList<String>(); |
这样看来右边的泛型声明就变得是多余的了?
在Java7中,对这一点进行了改进,就不必两边都要声明泛型,这种只适用<>标记的操作,称之为钻石操作符Diamond Operator
:
1 | List<String> list = new ArrayList<>(); |
对比之前的用法是不是很清晰很方便呢?
但是Java7中钻石操作符不允许在匿名类上使用:
1 | List<String> list = new ArrayList<>(); |
如果与匿名类共同使用,会报错:
'<>' cannot be used with anonymous classes
在Java7版本以前,try的使用方法如下(流等资源的关闭在finally中进行,否则会导致资源泄漏):
1 | public static void main(String[] args) { |
Java7中,可以实现资源的自动关闭,但前提是资源必须要在try的子语句中进行初始化,否则编译会报错:
1 | public static void main(String[] args) { |
Java7中出了try作了改进,catch也同样作了改进:
1 | try { |
1 | try { |
catch子语句中ex默认是final的,在catch语句块中不能改变ex,否则会编译报错。