1. 程式人生 > >JDK8新特性-java.util.function-Function介面

JDK8新特性-java.util.function-Function介面

14年,Oracle公司如期釋出了Java 8正式版。現如今4年過去了,終於鼓起勇氣認真對待它,就好似雖然認識了好幾年的夥伴,突然感覺要成為情侶的感覺……
JDK 1.8 API包含了很多內建的函式式介面,在老Java中常用到的比如Comparator或者Runnable介面,這些介面都增加了@FunctionalInterface註解以便能用在lambda上。現如今,我們則從Function常用函式入口,真正瞭解一下。

name type description
Consumer Consumer< T > 接收T物件,不返回值
Predicate Predicate< T > 接收T物件並返回boolean
Function Function< T, R > 接收T物件,返回R物件
Supplier Supplier< T > 提供T物件(例如工廠),不接收值
UnaryOperator UnaryOperator 接收T物件,返回T物件
BinaryOperator BinaryOperator 接收兩個T物件,返回T物件

標註為FunctionalInterface的介面被稱為函式式介面,該介面只能有一個自定義方法,但是可以包括從object類繼承而來的方法。如果一個介面只有一個方法,則編譯器會認為這就是一個函式式介面。是否是一個函式式介面,需要注意的有以下幾點:

  • 該註解只能標記在”有且僅有一個抽象方法”的介面上。
  • JDK8介面中的靜態方法和預設方法,都不算是抽象方法。
  • 介面預設繼承java.lang.Object,所以如果介面顯示宣告覆蓋了Object中方法,那麼也不算抽象方法。
  • 該註解不是必須的,如果一個介面符合”函式式介面”定義,那麼加不加該註解都沒有影響。加上該註解能夠更好地讓編譯器進行檢查。如果編寫的不是函式式介面,但是加上了@FunctionInterface,那麼編譯器會報錯。
  • 在一個介面中定義兩個自定義的方法,就會產生Invalid ‘@FunctionalInterface’ annotation; FunctionalInterfaceTest is not a functional interface錯誤.

Function常用方法&&實踐

//將Function物件應用到輸入的引數上,然後返回計算結果。
R apply(T t);
//返回一個先執行當前函式物件apply方法再執行after函式物件apply方法的函式物件。
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }
//返回一個先執行before函式物件apply方法再執行當前函式物件apply方法的函式物件
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }

compose 和 andThen 的不同之處是函式執行的順序不同。compose 函式先執行引數,然後執行呼叫者,而 andThen 先執行呼叫者,然後再執行引數。

public static void main(String[] args) {
        Function<Integer, Integer> name = e -> e * 2;
        Function<Integer, Integer> square = e -> e * e;
        int value = name.andThen(square).apply(3);
        System.out.println("andThen value=" + value);
        int value2 = name.compose(square).apply(3);
        System.out.println("compose value2=" + value2);
        //返回一個執行了apply()方法之後只會返回輸入引數的函式物件
        Object identity = Function.identity().apply("huohuo");
        System.out.println(identity);
    }

直接看結果:

andThen value=36
compose value2=18
huohuo

apply基本應用

字串長度記錄返回

public class MyFunction implements Function<String,Integer>{

    @Override
    public Integer apply(String s) {
        return s.length();
    }
}

返回兩個字串的連線,BiFunction與Function的不同就是傳入兩個引數,依舊返回一個值。

public class MyBiFunction implements BiFunction<String, String, String> {
    @Override
    public String apply(String s, String s2) {
        return s+";"+s2;
    }
}

最後呼叫結果:

private static String hello = "Nice to meet you";
    private static String name = "my name is huohuo";

    public static void main(String[] args) {
        MyFunction myFunction = new MyFunction();
        MyBiFunction biFunction = new MyBiFunction();
        int num = myFunction.apply(hello);
        String valueBi = biFunction.apply(hello, name);
        //hello長度返回
        System.out.println(num);
        //語句整合返回
        System.out.println(valueBi);
    }

返回值:

16
Nice to meet you;my name is huohuo

其實使用的過程感覺這些都無所必要,但是對於新特性以及程式碼規範而言,即使是簡易程式碼,也有了一個整合的過程。Function簡單實踐僅此為止,下篇文章講述Predicate的使用。

相關推薦

JDK8 特性 java.util.function Function介面

參考部落格 : JDK8新特性-java.util.function-Function介面 原始碼(刪除了原始碼註釋): package java.util.function; import java.util.Objects; @FunctionalInterface pub

JDK8特性-java.util.function-Function介面

14年,Oracle公司如期釋出了Java 8正式版。現如今4年過去了,終於鼓起勇氣認真對待它,就好似雖然認識了好幾年的夥伴,突然感覺要成為情侶的感覺…… JDK 1.8 API包含了很多內建的函式式介面,在老Java中常用到的比如Comparator或者Ru

jdk8特性:在用Repository實體查詢是總是提示要java.util.Optional, 原 Inferred type 'S' for type parameter 'S' is not within its bound;

jdk8新特性:在用Repository實體查詢是總是提示要java.util.Optional 在使用springboot 方法報錯: Inferred type 'S' for type parameter 'S' is not within its bound; should extends xxx

JDK8特性-介面定義增強

1. 使用default、static新增普通方法 JDK8之前,介面中只可以有全域性屬性和抽象方法。 JDK8之後可以在介面中新增普通方法,使用default關鍵字 除了使用default定義方法之外,還可以使用static定義方法。 一旦使用static定義方法,意味著該方法只能通過類名

Java - JDK8特性,程式碼demo示例;

哈哈哈哈大魔都下雪啦,敲段程式碼暖和暖和,嘿嘿 public class jdk8Test { @Test public void LambdaNew() { //before jdk8 List<String> names = Arrays.asList

java高併發實戰(十)——併發除錯和JDK8特性

由於之前看的容易忘記,因此特記錄下來,以便學習總結與更好理解,該系列博文也是第一次記錄,所有有好多不完善之處請見諒與留言指出,如果有幸大家看到該博文,希望報以參考目的看瀏覽,如有錯誤之處,謝謝大家指出與留言。一、內容提要 多執行緒除錯的方法 執行緒dump及分析 JDK

jdk8特性:Lambda表示式(也稱為閉包、可傳遞的匿名函式)與函式式介面@FunctionalInterface

  1) 一個lambda可以由用逗號分隔的引數列表、–>符號與函式體三部分表示。例如: ex.1 Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.println( e ) ); ex.2  (

JDK8特性學習(一) Lambda表示式和函式式介面

Lambda表示式和函式式介面 剛進公司時,公司正處於由JDK7換用JDK8的時間短,之所以更換JDK版本,聽說是公司業務中需要用到JDK8的一些新特性。鑑於我現在也無事可做,姑且來學習總結一下JDK8的一些特性吧。水平有限,這篇勉強算是對他人部落格上零

JDK8特性 介面的變化--預設方法和靜態方法

本文主要是簡單的說明下jdk8出現的一個新特性–介面的增強。此次變化中,介面中某些方法也可以有方法體了。jdk8對於介面的設計,除了保留之前的版本記本特性外,還提供了兩個新的功能。除了抽象方法外,還可以有預設方法(default方法)和靜態方法(static方法

JDK8特性-lambda表示式,函式式介面

1. String.join /** * Returns a new String composed of copies of the * {@code CharSequence elements} joined together with a co

JDK8特性:函式式介面@FunctionalInterface的使用說明

我們常用的一些介面Callable、Runnable、Comparator等在JDK8中都添加了@FunctionalInterface註解。 通過JDK8原始碼javadoc,可以知道這個註解有以下特點: 1、該註解只能標記在"有且僅有一個抽象方法"的介面上。 2、JDK8介面中的靜

JDK8特性之函式式介面

什麼是函式式介面 先來看看傳統的建立執行緒是怎麼寫的 Thread t1 = new Thread(new Runnable() { @Override public void run() { System.out.pri

JDK8特性 Lambda表達式

抽象方法 img 擴展 ota 參數類型 star 執行 組成 collect 一、接口的默認方法二、Lambda 表達式三、函數式接口四、方法與構造函數引用五、Lambda 作用域六、訪問局部變量七、訪問對象字段與靜態變量八、訪問接口的默認方法九、Date API十、An

jdk8特性(文章推薦)

method targe href article int 比較 face lam border jdk9都已經出來了,雖然很多項目都已經使用jdk8,但是很少會用到jdk8中的新特性。本人經常用的到也就是使用Stream,Lambda,但也僅僅是使用,基本不知道什麽Fun

JDK8特性,給接口添加一個默認實現

out pack args 一個 print 允許 info ati jdk 在JDK8中,允許給接口本身添加一個默認的實現。用“default”進行修飾。如下實例 package interfacetest; public interface TestInterfac

JDK8特性,方法的引用

技術分享 main 圖片 new cto ger ons alt 標識 引用方法並運行 在Java中,方法和構造方法都看作是對象的一種,那麽你要引用它(不是調用),則可以用::來引用。用來存儲這個引用的類型用@FunctionlaInterface註解來標識。 示例: p

JDK8特性:接口的靜態方法和默認方法

tool IT highlight RR 類名 another 存在 ltm tar 在jdk8之前,interface之中可以定義變量和方法,變量必須是public、static、final的,方法必須是public、abstract的。由於這些修飾符都是默認的,所以在J

JDK8特性

++ println method 添加 jdk1.8 final rap ble key class A{ int n = 10; public void m(){ int a = 1;//在JDK1.8中,默認添加final---->fi

jdk8特性lambd表示式和stream

stream位於java.util.stream包,是一個介面 @FunctionalInterface interface IConvert<F, T> 介面 IConvert,傳參為型別 F,返回型別 T。 註解@FunctionalInterface保證了介面有且僅有一

jdk8特性之雙冒號 :: 用法及詳解

jdk8的新特性有很多,最亮眼的當屬函數語言程式設計的語法糖,本文主要講解下雙冒號::的用法。 概念 類名::方法名,相當於對這個方法閉包的引用,類似js中的一個func