JAVA8之函數(shù)式編程Function接口用法
從這章開始,會介紹幾個常用的函數(shù)式接口工具,首先先來看下這個大家族:

首先從Function接口開始介紹
一. 概述
該接口顧名思義,函數(shù)的意思,就像是數(shù)學,是給定一個參數(shù)然后返回結果.該類方法如下:
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方法,接受一個類型的參數(shù),有返回值.功能是將參數(shù)賦予相應的方法.
2. compose方法
默認方法,先用入參去調用apply方法,然后再用調用者去調用apply方法.調用的Object.requireNonNull是java7的新特性,如果before是null值的話直接拋出異常.
3. andThen方法
默認方法,與compose方法相反,先用調用者去調用apply方法,然后再用入參去調用apply方法.
4. identity方法
靜態(tài)方法,java8新特性,返回當前正在執(zhí)行的方法.
二. 示例
不難看出,除了第一個方法以外,其他三個方法的返回值都是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));
}
}
運行結果:

把計算過程也寫在上面應該就能知道執(zhí)行順序了吧.
三. 總結
這個工具類感覺就是回到了學數(shù)學的場景,自己規(guī)定函數(shù),然后調用函數(shù),其實不僅僅可以調用一次andThen方法,后面還以加,只是沒有寫出來而已,大家可以自己去嘗試一下.
補充知識:JAVA8之函數(shù)式編程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類型參數(shù),返回的也是一個Predicate類型.and方法用于兩個判斷是否都成立,與關系型運算符"&&"相似.而or方法則用于兩個判斷是否有一個成立.與關系型運算符"||"相似.
3.negate方法
該方法沒有傳入參數(shù),返回一個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> p1, 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"));
}
}
測試結果:

三. 總結
Predicate適合在工具類和條件篩選的條件下使用,減少if...else的使用,并且使用靈活.
以上這篇JAVA8之函數(shù)式編程Function接口用法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Spring?Security使用數(shù)據庫登錄認證授權
本文主要介紹了Spring?Security使用數(shù)據庫登錄認證授權,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01
Java While循環(huán) do-while循環(huán)用法
循環(huán)語句就是讓計算機根據條件做循環(huán)計算,在條件滿足時繼續(xù)循環(huán),條件不滿足時退出循環(huán),需要的朋友可以參考下2020-11-11
聊聊@RequestMapping和@GetMapping @PostMapping的區(qū)別
這篇文章主要介紹了@RequestMapping和@GetMapping及@PostMapping的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08

