Java函數式編程、lambda表達式

Java函數式編程、lambda表達式

Java8開始支持函數式編程、包括lambda表達式、Stream流。java

函數式編程用於簡化開發,對於某些類,或許只使用一次,那麼就不必對其進行單獨的實現一個類,java本來提供了簡化的方案,如內部類、匿名內部類等。編程

lambda對此更加簡化。app

函數式接口

函數式接口就是隻有一個方法的接口,想一想函數是否是一個個是獨立的。jvm

Runnable接口就是一個函數式接口,以下:函數式編程

@FunctionalInterface
public interface Runnable {
 
    public abstract void run();
}


//@FunctionalInterface註解表明這是一個函數式接口,但不是必須的,加上註解jvm會幫助檢查。
// public abstract void run();中的abstract也能夠省略,接口中的方法本就是抽象方法

使用了函數式接口後,就不須要實現類,直接使用lambda便可。函數

lambda表達式

lambda用於替代實現類,形式以下:spa

FunctionalInterface func=()->{
           ......
        };

實例

函數式接口

@FunctionalInterface
interface Func{

    void  hello();
}

lambda表達式

public class LambdaDemo  {

    public static void main(String[] args) {
        Func func=()->{
            System.out.println("hello");//lambda表達式

        };

         func.hello();//調用方法

    }
}

帶返回值

直接在抽象方法前加上返回類型,在lambda中有返回值便可。code

public class LambdaDemo  {

    public static void main(String[] args) {
        Func func=()->{
            System.out.println("hello");
            return "ok lambda";

        };

        String s = func.hello();
        System.out.println(s);

    }
}


@FunctionalInterface
interface Func{

    String  hello();
}

帶參數

參數聲明在抽象方法中,在lambda中加上類型便可:接口

public class LambdaDemo  {

    public static void main(String[] args) {
        Func func=(int a,String c)->{
            System.out.println("hello"+a+c);
            return "ok lambda";

        };

        String s = func.hello(8,"yes");
        System.out.println(s);

    }
}

lambda中的數據類型能夠略去開發

Func func=( a,c)->{
            System.out.println("hello"+a+c);
            return "ok lambda";

        };

若是隻有一個參數的話,連()均可以省略。

public class LambdaDemo  {

    public static void main(String[] args) {
        Func func=c->{            //lambda省去()
            System.out.println("hello "+c);
            return "ok lambda";

        };

        String s = func.hello("yes");
        System.out.println(s);

    }
}


@FunctionalInterface
interface Func{

    String  hello(String b);
}

內置函數式接口

JDK 1.8爲咱們預約義了許多函數式接口,它們位於java.util.function包中。

經常使用的以下:

序號 接口名 抽象方法 說明
1 Supplier<T> Tget() 無輸入參數,經過一系列操做產生一個結果返回
2 Consumer<T> voidaccept(Tt) 一個輸入參數,針對參數作一系列操做,無返回值
3 Function<T,R> Rapply(Tt) 一個參數,一個返回值,針對參數生成一個返回值
相關文章
相關標籤/搜索