天天看點

函數式程式設計-lambda函數與jdk8自帶的函數接口

目錄

​​寫在前面​​

​​一、常見寫法​​

​​二、@FunctionalInterface注解​​

​​三、default方法​​

​​四、jdk8自帶的函數接口(重點)​​

​​ Predicate​​

​​Consumer​​

​​Function​​

​​Supplier​​

​​BiFunction​​

​​jdk提供了很多基本資料類型的類,可以直接使用不需要加泛型​​

​​執行個體​​

寫在前面

本文主要是介紹jdk8自帶的函數接口,預設認為讀者已經了解或接觸過lambda函數基礎。

學習jdk8自帶的函數接口,主要是為了進一步學習stream流式程式設計。

一、常見寫法

interface Interface1 {
   int doubleNum(int i);
}

public static void main(String[] args) {
   Interface1 i1 = (i) -> i * 2;

   Interface1 i2 = i -> i * 2;

   Interface1 i3 = (int i) -> i * 2;

   Interface1 i4 = (int i) -> {
      System.out.println("-----");
      return i * 2;
   };

}      

二、@FunctionalInterface注解

lambda表達式實作的接口,必須有且僅有一個要實作的方法,使用@FunctionalInterface注解标注之後,如果不符合lambda接口格式,會編譯報錯。

@FunctionalInterface
interface Interface1 {
   int doubleNum(int i);
}      

三、default方法

java8可以在接口中編寫default預設實作的方法。

若兩個接口,都有一個相同的名稱、參數的default方法,兩個接口被同一個類實作之後,這個類必須要重寫這個default方法(編譯期就會報錯)。

@FunctionalInterface
interface Interface1 {
   int doubleNum(int i);

   default int add(int x, int y) {
      return x + y;
   }
}      

四、jdk8自帶的函數接口(重點)

函數式程式設計-lambda函數與jdk8自帶的函數接口

 Predicate

核心方法:

boolean test(T t);      

輸入一個任意類型的參數,輸出一個boolean類型。

Consumer

核心方法:

void accept(T t);      

輸入一個任意類型的參數,無輸出。

Function

核心方法:

R apply(T t);      

輸入一個任意類型的參數,輸出一個任意類型的參數。

Supplier

核心方法:

T get();      

無輸入參數,輸出一個任意類型的參數。

BiFunction

核心方法:

R apply(T t, U u);      

jdk提供了很多基本資料類型的類,可以直接使用不需要加泛型

執行個體

import java.text.DecimalFormat;
import java.util.function.Function;

class MyMoney {
   private final int money;

   public MyMoney(int money) {
      this.money = money;
   }

    // jdk8自帶的接口,Integer為入參,String為出參
   public void printMoney(Function<Integer, String> moneyFormat) {
      System.out.println("我的存款:" + moneyFormat.apply(this.money));
   }
}

public class MoneyDemo {

   public static void main(String[] args) {
      MyMoney me = new MyMoney(99999999);

      Function<Integer, String> moneyFormat = i -> new DecimalFormat("#,###")
            .format(i);
      // 函數接口鍊式操作
      me.printMoney(moneyFormat.andThen(s -> "人民币 " + s));
   }

}

// 執行結果:
// 我的存款:人民币 99,999,999      
public static void main(String[] args) {
   // 斷言函數接口
   IntPredicate predicate = i -> i > 0;
   System.out.println(predicate.test(-9));

   // IntConsumer,jdk中自帶一些基本資料類型的,就不需要寫泛型了
   // 消費函數接口
   Consumer<String> consumer = s -> System.out.println(s);
   consumer.accept("輸入的資料");
}