国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java函數(shù)式編程最佳實踐

這篇具有很好參考價值的文章主要介紹了Java函數(shù)式編程最佳實踐。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

別人說爛了的stream api不就不想贅述了,我想和大家分享一下,如何用函數(shù)式編程來簡化我們的開發(fā),想說點不一樣的東西
轉(zhuǎn)載鏈接

簡化事務(wù)

對于事務(wù)而言,應(yīng)該粒度越小越好,并且讀寫邏輯應(yīng)該分開,只在寫的邏輯上執(zhí)行事務(wù),可以用函數(shù)式編程來簡化抽去寫邏輯這一步

@Service
public class TransactionService {
    @Transactional
    public void process(ThrowExceptionRunnable runnable){
        try {
            runnable.run();
        }catch (Exception e){
            new RuntimeException(e);
        }
    }
}

//使用方式
public void regist(String username){
	User user = userService.findByUserName(username);
  	if(user != null) return;
  	
  	//執(zhí)行事務(wù) 注冊用戶 開通余額賬號
  	transactionService.process(() -> {
      	userService.save(new User(username));
        balanceService.save(new Balance(username));
    });
}

賦予方法重試能力

public static void retryFunction(ThrowExceptionRunnable runnable, int time) {
        while (true) {
            try {
                runnable.run();
                return;
            } catch (Exception e) {
                time--;
                if (time <= 0) throw new RuntimeException(e);
            }
        }
    }
    public static <T, R> R retryFunction(ThrowExceptionFunction<T, R> function, T t, int time) {
        while (true) {
            try {
                return function.apply(t);
            } catch (Exception e) {
                time--;
                if (time <= 0) throw new RuntimeException(e);
            }
        }
    }
    public static <T, U, R> R retryFunction(ThrowExceptionBiFunction<T, U, R> function, T t, U u, int time) {
        while (true) {
            try {
                return function.apply(t, u);
            } catch (Exception e) {
                time--;
                if (time <= 0) throw new RuntimeException(e);
            }
        }
    }
    public static void main(String[] args) {
  	//http調(diào)用,失敗會重試3次
     	retryFunction(()->http.call(),3);
  	//把數(shù)字1轉(zhuǎn)成數(shù)字 失敗會重試三次
  	String s = retryFunction(String::valueOf, 1, 3);
  	String ss = retryFunction(i -> String.valueOf(i), 1, 3);
    }

賦予函數(shù)緩存能力

public static <T, R> R cacheFunction(Function<T, R> function, T t, Map<T, R> cache) {
    R r = cache.get(t);
    if (r != null) return r;
    R result = function.apply(t);
    cache.put(t,result);
    return result;
}

public static void main(String[] args) {
        Map<String,User> cache = new HashMap<Integer, User>();
        String username = "張三";
  			//不走緩存
        cacheFunction(u -> userService.findByUserName(u),username,cache);
  			//走緩存
        cacheFunction(u -> userService.findByUserName(u),username,cache);
    }

賦予函數(shù)報錯返回默認值能力

public static <T, R> R computeOrGetDefault(ThrowExceptionFunction<T, R> function, T t, R r) {
        try {
            return function.apply(t);
        } catch (Exception e) {
            return r;
        }
    }
    public static <R> R computeOrGetDefault(ThrowExceptionSupplier<R> supplier,R r){
        try {
            return supplier.get();
        } catch (Exception e) {
            return r;
        }
    }

	public static void main(String[] args) {
  	//返回0
  	computeOrGetDefault(i -> {
           if (i < 0) throw new RuntimeException();
           else return i;
        }, -1, 0);
  	//返回5
        computeOrGetDefault(i -> {
            if (i < 0) throw new RuntimeException();
            else return i;
        },5,0);
    }

賦予函數(shù)處理異常的能力

public static <T, R> R computeAndDealException(ThrowExceptionFunction<T, R> function, T t, Function<Exception, R> dealFunc) {
        try {
            return function.apply(t);
        } catch (Exception e) {
            return dealFunc.apply(e);
        }
    }

    public static <T, U, R> R computeAndDealException(ThrowExceptionBiFunction<T,U, R> function, T t, U u,Function<Exception, R> dealFunc) {
        try {
            return function.apply(t,u);
        } catch (Exception e) {
            return dealFunc.apply(e);
        }
    }

    public static <R> R computeAndDealException(ThrowExceptionSupplier<R> supplier, Function<Exception, R> dealFunc) {
        try {
            return supplier.get();
        } catch (Exception e) {
            return dealFunc.apply(e);
        }
    }

public static void main(String[] args) {
    //返回異常message的hashcode
    Integer integer = computeAndDealException(i -> {
        if (i < 0) throw new RuntimeException("不能小于0");
        else return i;
    }, -1, e -> e.getMessage().hashCode());
    System.out.println(integer);
  
}

賦予函數(shù)記錄日志能力

public static <T, R> R logFunction(Function<T, R> function, T t, String logTitle) {
    long startTime = System.currentTimeMillis();
    log.info("[[title={}]],request={},requestTime={}", logTitle, t.toString(),
    	    LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
    R apply = function.apply(t);
    long endTime = System.currentTimeMillis();
    log.info("[[title={}]],response={},spendTime={}ms", logTitle, apply.toString(), endTime - startTime);
    return apply;
}

public static void main(String[] args) {
    logFunction(String::valueOf,"s","String.valueOf");
}

自定義函數(shù)接口

    @FunctionalInterface
    public interface ThrowExceptionFunction<T, R> {
        R apply(T t) throws Exception;
    }

    @FunctionalInterface
    public interface ThrowExceptionBiFunction<T, U, R> {
        R apply(T t, U u) throws Exception;
    }
    @FunctionalInterface
    public interface ThrowExceptionSupplier<T> {
        T get() throws Exception;
    }
    @FunctionalInterface
    public interface ThrowExceptionRunnable {
        void run() throws Exception;
    }

Q:為什么要自定義函數(shù)接口

A:自帶的函數(shù)接口無法處理檢查異常,遇見帶檢查異常的方法會報錯

我哪些場景用到了?

鏈?zhǔn)饺?shù)

在翻譯php代碼的時候我們常常遇到如下情況

$s = a.b.c.d.e.f.g

然后翻譯成java代碼的時候是這樣的

String s = a.getB().getC().getD().getE().getF().getG();

有啥問題?沒有沒有判空,只要中間有一層為空,那么就是NPE,要是去寫判空邏輯的話,真是要了命了

這時我們就可以用上上面提到的騷操作了

代碼改寫文章來源地址http://www.zghlxwxcb.cn/news/detail-796240.html

String s = computeOrGetDefault(()->a.getB().getC().getD().getE().getF().getG(),"");
事務(wù)
簡單的降級操作(computeAndDealException)
接口重試
接口緩存
記錄日志

到了這里,關(guān)于Java函數(shù)式編程最佳實踐的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 游戲開發(fā)的最佳編程語言及免費引擎推薦

    游戲開發(fā)的最佳編程語言及免費引擎推薦

    游戲至今仍然是人們重要的娛樂方式之一,那么哪種編程語言最適合游戲開發(fā)呢?這取決于要開發(fā)的游戲類型。例如,如果你想開發(fā)一個2D平臺游戲,Lua腳本和JavaScript這樣的語言比較方便。但是,如果想要開發(fā)大型3D第一人稱射擊游戲,那么用C++或C#之類的語言更加合適。 游

    2024年02月12日
    瀏覽(32)
  • OpenCV 編譯為java依賴最佳實踐

    OpenCV 編譯為java依賴最佳實踐

    opencv 編譯為java依賴最佳實踐 OpenCV使用領(lǐng)域越來越廣,但作為c++開源軟件,作者更新維護并不及時,另外其他第三方j(luò)ava轉(zhuǎn)換方式更加無法及時同步最新版本。 最新版本為4.9.0(20240124) 使用JavaCV,包含組件較多,大而全,無法及時推出stable發(fā)行版; org.bytedeco, 目前開發(fā)版兼容,

    2024年04月24日
    瀏覽(15)
  • JAVA OOM異??捎^測最佳實踐

    JAVA OOM異常可觀測最佳實踐

    堆溢出-java.lang.OutOfMemoryError: Java heap space。 棧溢出-java.lang.OutOfMemorryError。 棧溢出-java.lang.StackOverFlowError。 元信息溢出-java.lang.OutOfMemoryError: Metaspace。 直接內(nèi)存溢出-java.lang.OutOfMemoryError: Direct buffer memory。 GC超限-java.lang.OutOfMemoryError: GC overhead limit exceeded。 垃圾回收器就是內(nèi)存

    2024年02月06日
    瀏覽(22)
  • Java 設(shè)計模式最佳實踐:6~9

    原文:Design Patterns and Best Practices in Java 協(xié)議:CC BY-NC-SA 4.0 譯者:飛龍 本文來自【ApacheCN Java 譯文集】,采用譯后編輯(MTPE)流程來盡可能提升效率。 這一章將描述反應(yīng)式編程范式,以及為什么它能很好地適用于帶有函數(shù)元素的語言。讀者將熟悉反應(yīng)式編程背后的概念。我們

    2023年04月14日
    瀏覽(23)
  • Java中實現(xiàn)HTTPS連接的最佳實踐

    Java中實現(xiàn)HTTPS連接的最佳實踐

    引言 大家好!我是小黑。今天咱們來聊聊一個既熱門又實用的話題:在Java中如何實現(xiàn)HTTPS連接。現(xiàn)在的網(wǎng)絡(luò)世界,安全性是大家都非常關(guān)注的問題,特別是對于咱們這些程序員來說,更是如此。想想看,如果你的網(wǎng)站或應(yīng)用數(shù)據(jù)泄露了,那得有多嚴重!所以,理解并實現(xiàn)HT

    2024年02月02日
    瀏覽(20)
  • 編程開發(fā)8大語言詳解,為什么Java是我最推薦的?

    編程開發(fā)8大語言詳解,為什么Java是我最推薦的?

    很多沒有接觸過編程語言的同學(xué),都會覺得編程開發(fā)特別高端和神奇,擔(dān)心理解不了更擔(dān)心學(xué)不會。 當(dāng)然,也有人會認為,你既然是做編程的,那么你應(yīng)該什么都會,什么軟件的開發(fā)都能完成,這是平哥經(jīng)常聽到的兩種聲音。 在此,平哥需要給大家科普一下, 編程確實改變

    2024年02月05日
    瀏覽(18)
  • 前端開發(fā)之函數(shù)式編程實踐

    作者:京東科技?牛志偉 1、ES6中的map、filter、reduce等函數(shù) 2、React類組件 - 函數(shù)式組件+hooks、Vue3中的組合式API 3、RxJS、Lodash和Ramda等JS庫 4、中間件/插件,如Redux中的applyMiddleware中間件實現(xiàn) 函數(shù)式編程是一種編程范式,它將程序抽象為函數(shù)和數(shù)據(jù)結(jié)構(gòu),通過函數(shù)調(diào)用來實現(xiàn)程序

    2024年02月04日
    瀏覽(20)
  • Java 中的異常類型、異常處理機制、最佳實踐

    Java 異常是一種在程序運行時可能出現(xiàn)的錯誤或異常狀況。它們可以由多種因素引起,例如無效輸入、網(wǎng)絡(luò)連接失敗或系統(tǒng)資源不足等。 Java 提供了內(nèi)置的異常類和處理機制,以便在程序出現(xiàn)異常時能夠進行恰當(dāng)?shù)奶幚砗晚憫?yīng)。本文將探討 Java 中的異常類型、異常處理機制以

    2024年02月08日
    瀏覽(24)
  • AI人工智能開發(fā)的5種最佳人工智能編程語言

    今天的AI程序員應(yīng)該掌握多種語言,因為他們在跨學(xué)科的環(huán)境中工作,而不是在孤島中工作。 雖然當(dāng)前這一代人更喜歡Python,R,Java,Lisp,Prolog,Julia等 ,但前端開發(fā)人員必須了解JavaScript,Python和R的機器學(xué)習(xí)應(yīng)用程序。一家知名組織的流程自動化首席開發(fā)人員了解R,Java,

    2023年04月16日
    瀏覽(20)
  • Java異常處理的20個最佳實踐:告別系統(tǒng)崩潰

    在Java編程中,異常處理是一個至關(guān)重要的環(huán)節(jié),它不僅涉及到程序的穩(wěn)定性和安全性,還關(guān)系到用戶體驗和系統(tǒng)資源的合理利用。合理的異常處理能夠使得程序在面對不可預(yù)知錯誤時,能夠優(yōu)雅地恢復(fù)或者給出明確的反饋,而不是簡單地崩潰退出。 文章開始前,我們先看下

    2024年02月22日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包