title: Java8新特性
date: 2019-07-12 22:50
author: chgl16
summary: Java8的各种新特性,以及常用的Lambda表达式
tag: Lambda
categories: Java

img: https://i.loli.net/2019/08/05/d3tWHFqTupvPjIK.jpg

简介

Java8是里程碑的一个版本,不仅优化高效,也带来了很多好用的新特性。
函数式编程大大减少代码量和便于维护。

1.接口有默认方法和静态方法

在此之前,接口的方法默认是 public abstract 修饰的。
如果一个接口有多个方法,每次即便我们只需要用一个,也需要实现全部,而新特性带来的默认接口方法完美解决了这个。其实就是接口也有实现的方法。

public interface IAnimal {
    default void breath(){
        System.out.println("breath!");
    };
}

使用default关键字修饰

静态方法

private interface DefaulableFactory {
    // Interfaces now allow static methods
    static Defaulable create( Supplier< Defaulable > supplier ) {
        return supplier.get();
    }
}

2.函数式接口FunctonInteface配合Lambda

如果一个接口只有一个抽象方法,当然可以有多个默认实现的方法。这种接口称为函数式接口,可以使用Lambda表达式解决之前另外写实现类或者匿内部类的麻烦。

比如Runnable和Callable

@FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}
@FunctionalInterface
public interface Callable<V> {
    /**
     * Computes a result, or throws an exception if unable to do so.
     *
     * @return computed result
     * @throws Exception if unable to compute a result
     */
    V call() throws Exception;
}

这两个典型的只有一个抽象方法的接口,就是函数式接口。可以使用@java.lang.FunctionInteface注解标注。当然这只是个标注注解,可有可无。

Lambda表达式

Lambda表达式也称为闭包,也是匿名函数。
对于之前的Runnable,Callable这种抽象出来的策略模型接口,我们使用一般有两种方法:

  1. 另外新建一个类实现接口,然后以此创建对象
class Work implements Runnable {
    @Override
    public void run() {
        // do something
    }
}


public class Main {
    public static void main(String[] args) {
        Thread t1 = new Thread(new Work());
        t1.start();
    }
}
  1. 使用匿名内部类
    因为每次都另外定义一个实现类很麻烦,很多时候我们只是使用一次。因此可以简单的写为匿名内部类的形式。
Inteface instance = new Inteface() {
    @Override
    public T function(...) {
        // do something
    }
}

这是直接new 接口,然后实现即可。比如

public class Main {
    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                // do something
            }
        });
        t1.start();
    }
}



对比以上两种编码量还是很大的,当然这两种对接口的抽象方法数量没有限定,但是如果抽象方法只有一个的时候,使用Lambda匿名函数更优秀。

特别是对于常用的Runnabl、Callable以及比较器Comparator接口

public class Main {
    public static void main(String[] args) {
        Runnable work = () -> { 
            // do something
        };
        Thread t1 = new Thread(work);
        t1.start();
    }
}

非常简单,只需要 (抽象方法的参数列表) -> {实现代码}
如果实现代码只有一句,大花括号都可以省略。

其他改进

除了这个常用的新特性,还有以下一些改进。

  1. Date/time API改进
  2. 引入Stream流,结合Lambda更优
  3. 其他改进

  转载请注明: Chgl16

 本篇
title: Java8新特性date: 2019-07-12 22:50author: chgl16summary: Java8的各种新特性,以及常用的Lambda表达式tag: Lambdacategories: Java img:
2019-08-05 chgl16
下一篇 
查找算法总结 查找算法总结
常见的查找算法有7种 1. 顺序查找顺序查找对序列没有排序要求ASL = 1/n(1+2+3+…+n) = (n+1)/2;T((n+1)/2)复杂度为 O(n) 2. 折半查找也叫二分查找,必须是有序的序列。 int binarySear
  目录