1. 程式人生 > 程式設計 >JAVA8之函數語言程式設計Function介面用法

JAVA8之函數語言程式設計Function介面用法

從這章開始,會介紹幾個常用的函式式介面工具,首先先來看下這個大家族:

JAVA8之函數語言程式設計Function介面用法

首先從Function介面開始介紹

一. 概述

該介面顧名思義,函式的意思,就像是數學,是給定一個引數然後返回結果.該類方法如下:

package java.util.function;
import java.util.Objects;
 
@FunctionalInterface
public interface Function<T,R> {
 
 R apply(T t);
 
 default <V> Function<V,R> compose(Function<? super V,? extends T> before) {
  Objects.requireNonNull(before);
  return (V v) -> apply(before.apply(v));
 }
 
 default <V> Function<T,V> andThen(Function<? super R,? extends V> after) {
  Objects.requireNonNull(after);
  return (T t) -> after.apply(apply(t));
 }
 
 static <T> Function<T,T> identity() {
  return t -> t;
 }

1. apply方法

該介面的唯一個抽象類是apply方法,接受一個型別的引數,有返回值.功能是將引數賦予相應的方法.

2. compose方法

預設方法,先用入參去呼叫apply方法,然後再用呼叫者去呼叫apply方法.呼叫的Object.requireNonNull是java7的新特性,如果before是null值的話直接丟擲異常.

3. andThen方法

預設方法,與compose方法相反,先用呼叫者去呼叫apply方法,然後再用入參去呼叫apply方法.

4. identity方法

靜態方法,java8新特性,返回當前正在執行的方法.

二. 示例

不難看出,除了第一個方法以外,其他三個方法的返回值都是Function,所以後面三個方法是可以鏈式呼叫(即用"."方法)的,就如建造者模式(Build)一樣.理論講完,上程式碼:

package com.yczuoxin.demo; 
import java.util.function.Function; 
public class FunctionTest {
 public static void main(String[] args) {
  // 先宣告方法
  Function<Integer,Integer> funcDouble = (n) -> n * 2;
  Function<Integer,Integer> funcPlus2 = (n) -> n + 2;
 
  System.out.println(funcDouble.apply(3));
  System.out.println(funcPlus2.apply(3));
 
  System.out.println(funcDouble.andThen(funcPlus2).apply(3));
  System.out.println(funcDouble.compose(funcPlus2).apply(3));
  System.out.println(Function.identity().compose(funcDouble).apply(8));
 }
}

執行結果:

JAVA8之函數語言程式設計Function介面用法

把計算過程也寫在上面應該就能知道執行順序了吧.

三. 總結

這個工具類感覺就是回到了學數學的場景,自己規定函式,然後呼叫函式,其實不僅僅可以呼叫一次andThen方法,後面還以加,只是沒有寫出來而已,大家可以自己去嘗試一下.

補充知識:JAVA8之函數語言程式設計Predicate介面

一.概述

先上這個介面的原始碼:

package java.util.function; 
import java.util.Objects; 
@FunctionalInterface
public interface Predicate<T> {
 
 boolean test(T t);
 
 default Predicate<T> and(Predicate<? super T> other) {
  Objects.requireNonNull(other);
  return (t) -> test(t) && other.test(t);
 }
 
 default Predicate<T> negate() {
  return (t) -> !test(t);
 }
 
 default Predicate<T> or(Predicate<? super T> other) {
  Objects.requireNonNull(other);
  return (t) -> test(t) || other.test(t);
 }
 
 static <T> Predicate<T> isEqual(Object targetRef) {
  return (null == targetRef)
    ? Objects::isNull
    : object -> targetRef.equals(object);
 }
}

1.test方法

該方法是接受一個傳入型別,返回一個布林值.此方法應用於判斷.

2.and方法,or方法

該些方法接收的是一個Predicate型別引數,返回的也是一個Predicate型別.and方法用於兩個判斷是否都成立,與關係型運算子"&&"相似.而or方法則用於兩個判斷是否有一個成立.與關係型運算子"||"相似.

3.negate方法

該方法沒有傳入引數,返回一個Predicate型別.此方法用於對判斷進行取反.與關係型雲演算法"!"相似.

4.isEqual方法

該方法接收一個Object物件,返回一個Predicate型別.此方法用於判斷第一個test的方法與第二個test方法相同(equal).

二. 示例

寫一個判斷字串的一個判斷工具類,包含Predicate4種方法,並返回判斷結果.

package com.yczuoxin.demo.predicate; 
import java.util.function.Predicate; 
public class PredicateUtil {
 public static boolean judgeString(String str,Predicate<String> p){
  if(null == str){
   return false;
  }
  return p.test(str);
 }
 
 public static boolean judgeNoString(String str,Predicate<String> p){
  if(null == str){
   return false;
  }
  return p.negate().test(str);
 }
 
 public static boolean judgeAndDoubleString(String str,Predicate<String> p1,Predicate<String> p2){
  if(null == str){
   return false;
  }
  return p1.and(p2).test(str);
 }
 
 public static boolean judgeOrDoubleString(String str,Predicate<String> p2){
  if(null == str){
   return false;
  }
  return p1.or(p2).test(str);
 }
}

測試字串長度是否大於4的方法用例:

package com.yczuoxin.demo.predicate; 
import java.util.function.Predicate; 
public class PredicateTest {
 public static void main(String[] args) {
  String testString = "abcde";
  // 判斷字串長度是否大於4
  System.out.println(PredicateUtil.judgeString(testString,p->p.length()>4));
  // 判斷字串長度是否大於4再取反
  System.out.println(PredicateUtil.judgeNoString(testString,p->p.length()>4));
  // 判斷字串長度是否大於4並且小於8
  System.out.println(PredicateUtil.judgeAndDoubleString(testString,p->p.length()>4,p->p.length()<8));
  // 判斷字串長度是否小於4並且大於8
  System.out.println(PredicateUtil.judgeOrDoubleString(testString,p->p.length()<4,p->p.length()>8));
  // 判斷當前方法是否是"test"方法.
  System.out.println(Predicate.isEqual("test").test("test"));
  System.out.println(Predicate.isEqual("test").test("test1"));
 }
}

測試結果:

JAVA8之函數語言程式設計Function介面用法

三. 總結

Predicate適合在工具類和條件篩選的條件下使用,減少if...else的使用,並且使用靈活.

以上這篇JAVA8之函數語言程式設計Function介面用法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。