最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JAVA8之函數(shù)式編程Function接口用法

 更新時間:2020年12月07日 09:47:44   作者:Zn昕  
這篇文章主要介紹了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接口用法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java TimedCache 帶時間緩存工具類詳解使用

    Java TimedCache 帶時間緩存工具類詳解使用

    工具類是包含集合框架、遺留的 collection 類、事件模型、日期和時間設施、國際化和各種實用工具類(字符串標記生成器、隨機數(shù)生成器和位數(shù)組、日期Date類、堆棧Stack類、向量Vector類等)。集合類、時間處理模式、日期工具等各類常用工具包,本文將介紹帶時間緩存工具類
    2021-10-10
  • Mybatis之Select Count(*)的獲取返回int的值操作

    Mybatis之Select Count(*)的獲取返回int的值操作

    這篇文章主要介紹了Mybatis之Select Count(*)的獲取返回int的值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Project?Reactor?響應式范式編程

    Project?Reactor?響應式范式編程

    這篇文章主要為大家介紹了Project?Reactor?響應式范式編程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • java編程之xpath介紹

    java編程之xpath介紹

    這篇文章主要介紹了java編程之xpath介紹,具有一定借鑒價值,需要的朋友可以參考下
    2017-12-12
  • Java SQL注入案例教程及html基礎入門

    Java SQL注入案例教程及html基礎入門

    這篇文章主要介紹了前端開發(fā)每天必學之SQL及HTML入門基礎知識,介紹了學習web前端開發(fā)需要掌握的基礎技術,感興趣的小伙伴們可以參考一下
    2021-07-07
  • BiConsumer接口中的方法andThen?accept使用詳解

    BiConsumer接口中的方法andThen?accept使用詳解

    這篇文章主要為大家介紹了BiConsumer接口中的方法andThen?accept使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • java中ThreadLocal的應用場景實例分析

    java中ThreadLocal的應用場景實例分析

    在本篇文章里小編給大家整理的是一篇關于java中ThreadLocal的應用場景實例分析,對此有興趣的朋友們可以學習參考下。
    2021-02-02
  • springcloud?如何解決微服務之間token傳遞問題

    springcloud?如何解決微服務之間token傳遞問題

    這篇文章主要介紹了springcloud?如何解決微服務之間token傳遞問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java實現(xiàn)一個達達租車系統(tǒng)的步驟詳解

    Java實現(xiàn)一個達達租車系統(tǒng)的步驟詳解

    這篇文章主要給大家介紹了利用Java實現(xiàn)一個達達租車系統(tǒng)的步驟,文中給出了詳細的實現(xiàn)思路和示例代碼,并在文末給出了完整的源碼供大家學習下載,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-04-04
  • Java編程 多態(tài)

    Java編程 多態(tài)

    這篇文章主要介紹了關于Java編程的多態(tài),多態(tài)通過分離做什么和怎么做,從另一個角度將接口和實現(xiàn)分離開來。構建可擴展的程序,需要的朋友可以參考下
    2021-10-10

最新評論

灵川县| 泊头市| 合阳县| 西和县| 东乌珠穆沁旗| 桂林市| 保康县| 定西市| 百色市| 阳信县| 巴马| 南京市| 商丘市| 桑植县| 陇西县| 吐鲁番市| 江川县| 行唐县| 吴忠市| 北碚区| 弋阳县| 东乡| 阳江市| 漯河市| 崇明县| 阿坝县| 凌海市| 绵竹市| 承德市| 龙井市| 会同县| 西昌市| 慈利县| 略阳县| 陇川县| 建阳市| 博野县| 邢台市| 阆中市| 上蔡县| 陵水|