Java8以及Java9的一些有用的新特性总结

Java 8:

1.Lambda表达式

首先,什么是Lambda表达式?

所谓的Lambda表达式通俗的讲就是一种没有名字的函数,其中涉及到一些函数式编程的知识,这在移动开发领域应用十分广泛,关于函数式编程网络上的资料有很多,有兴趣的朋友可以自行查阅,使用这种表达式好处是可以使得我们的代码更加的简洁,当然这会使得代码的可读性大大降低,在一些情况下,也会造成代码的效率变差。

下面给出一个使用Lambda表达式的例子:

public class Test03 {
    public static void main(String[] args) {
        List<Integer> list=new ArrayList<>();
        for(int i=0;i<10;i++){
            list.add(i);
        }
        list.forEach((temp)-> System.out.println(temp));
    }

}

定义了一个匿名的函数,其作用就是输出temp的值。很不一样,是吧?通过源码,我们来看一下forEach()函数的构造:

default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

其实也是遍历了list中的元素,然后丢给action的accept()方法。

2.默认方法

然后看一下Consumer这个参数,其实这是一个函数式接口,这也是Java8的一个新特新

@FunctionalInterface
public interface Consumer<T> {

    /**
     * Performs this operation on the given argument.
     *
     * @param t the input argument
     */
    void accept(T t);

    /**
     * Returns a composed {@code Consumer} that performs, in sequence, this
     * operation followed by the {@code after} operation. If performing either
     * operation throws an exception, it is relayed to the caller of the
     * composed operation.  If performing this operation throws an exception,
     * the {@code after} operation will not be performed.
     *
     * @param after the operation to perform after this operation
     * @return a composed {@code Consumer} that performs in sequence this
     * operation followed by the {@code after} operation
     * @throws NullPointerException if {@code after} is null
     */
    default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }

怎么接口中也可以定义方法了?其实这叫做缺省方法,下面是其相关的解释:

“缺省方法是在接口中定义方法实现的一种方式,并且保证所有已经存在的子类的兼容性,所以实现了接口的类默认都拥有在接口中定义的缺省方法,这有点像一个抽象类。当一个子类中没有覆盖缺省方法时,则对子类的该方法的调用将调用接口中的实现。”

3.静态方法

public interface Test031 {
    static int test(int n){
        if(n==1) return 1;
        if(n==2) return 1;
        return test(n-1)+test(n-2);
    }
}

4.优化了HashMap以及concurrenthashmap

将HashMap原来的数组+链表的结构优化成了数组+链表+红黑树的结构,减少了hash碰撞造成的链表长度过长,时间复杂度过高的问题,
concurrenthashmap 则改进了原先的分段锁的方式,采用
transient volatile HashEntry<K,V>[] table来保存数据。

还有的一些特性在http://www.cnblogs.com/pkufork/p/java_8.html中有介绍,这里不再赘述。

5.JVM

PermGen空间被移除了,取而代之的是Metaspace。JVM选项-XX:PermSize与-XX:MaxPermSize分别被-XX:MetaSpaceSize与-XX:MaxMetaspaceSize所代替。

6.新增原子性操作类LongAdder

7.新增StampedLock


Java9:

1.jshell

使用指南:

http://docs.oracle.com/javase/9/jshell/toc.htm

2.私有接口方法

现在接口真是越来越像强大了,先是可以编写方法,现在连访问权限都可以定义成private的了,我在网上copy了一个例子:

public interface MyInterface {

  void normalInterfaceMethod();

  default void interfaceMethodWithDefault() { init(); }

  default void anotherDefaultMethod() { init(); }

  // This method is not part of the public API exposed by MyInterface
  private void init() { System.out.println("Initializing"); }
}

大体就是实现接口的类不想把复用代码创建为一个默认方法,所以通过一个私有的辅助方法解决这个问题。

3.更改了 HTTP 调用的相关api(有点像Retrofit啊,有木有)

HttpClient client = HttpClient.newHttpClient();

HttpRequest req =
  HttpRequest.newBuilder(URI.create("http://www.google.com"))
       .header("User-Agent","Java")
       .GET()
       .build();


HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandler.asString());

4.集合工厂方法

初始化集合类的时候不用使用add()方法去添加元素了,直接调用Set.of(…)即可完成初始化。

5.改进了 Stream API

以上就是java8、9的一些新特性,如有错误还请指正。

参考文章:

http://www.importnew.com/17262.html

http://liugang594.iteye.com/blog/2063432

    原文作者:平凡的LU同学
    原文地址: https://blog.csdn.net/yalishadaa/article/details/78152717
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞