摘要:所以通過上面的例子可以看出函數式編程和結合的非常緊密。小結本篇簡單介紹了函數式編程與應用及類方法引用的使用,表達式讓老版本的代碼更簡潔,方法引用讓表達式更簡潔,實際上就是表達式的一種語法糖。
上一篇文章中,我們介紹了幾個Java8內置的函數式接口的特點和使用方式,并在最后引出了stream api的知識點,接下來我們開始學習Java8中的stream api。
先假設一個簡單的需求,存在一個字符串集合,我們想把所有長度大于5的字符串轉換成大寫輸出到控制臺,之前我們可能會直接這么做
public class Test3 { public static void main(String[] args) { Listlist = Arrays.asList("hello","world","helloworld"); for (int i = 0; i < list.size(); i++) { if(list.get(i).length() > 5){ System.out.println(list.get(i).toUpperCase()); } } } }
現在換成使用stream api看下
public class Test3 { public static void main(String[] args) { Listlist = Arrays.asList("hello","world","helloworld"); list.stream().filter(s -> s.length() > 5).map(s -> s.toUpperCase()).forEach(System.out::println); } }
1行代碼直接搞定,而且這種鏈式編程風格從語義上看邏輯很清晰。
stream方法先構造了一個該集合的Stream對象,filter方法取出長度大于5的字符串,map方法將所有字符串轉大寫,forEach輸出到控制臺。我們可以對照Stream接口的源碼片段看下這幾個stream api的定義
public interface Streamextends BaseStream > { Stream filter(Predicate super T> predicate); Stream map(Function super T, ? extends R> mapper); void forEach(Consumer super T> action); . .省略 . }
filter方法,接收一個Predicate函數式接口類型作為參數,并返回一個Stream對象,從上一篇我們知道可以由一個接收一個參數返回布爾類型的lambda表達式來創建Predicate函數式接口實例,所以看到filter接收的參數是s -> s.length() > 5
map方法,接收Function函數式接口類型,接收一個參數,有返回值s -> s.toUpperCase() 正是做了這件事情
forEach方法,接收Consumer函數式接口類型,接收一個參數,不返回值 這里使用方法引用的其中一種形式System.out::println來創建了Consumer實例。
所以通過上面的例子可以看出函數式編程和stream api結合的非常緊密。大家應該也注意到了在介紹每個方法時,我們提到了有中間操作和終止操作,終止操作意味著我們需要一個結果了,當程序遇到終止操作時才會真正執行。中間操作是指在終止操作之前所有的方法,這些方法以方法鏈的形式組織在一起處理一些列邏輯,如果只有中間操作而沒有終止操作的話即使運行程序,代碼也不會執行的。
實際上map方法中可以使用另一種方法引用的形式來處理,類方法引用。語法:類名::方法名
public class Test3 { public static void main(String[] args) { Listlist = Arrays.asList("hello","world","helloworld"); list.stream().filter(s -> s.length() > 5).map(String::toUpperCase).forEach(System.out::println); } }
之前介紹的System.out::println這種屬于對象方法引用,類方法引用的應用也是很廣泛的。只是理解起來需要花費些時間,map方法接收一個Function函數式接口的實現,那就肯定需要一個輸入并且有一個輸出,但是我們看下toUpperCase方法的定義
public String toUpperCase() { return toUpperCase(Locale.getDefault()); }
有返回值,但是沒有入參,乍一看也不符合Function接口中apply方法的定義啊。這也是類方法引用的特點,雖然toUpperCase沒有明確的入參,因為此時toUpperCase的輸入是調用它的那個對象,編譯器會把調用toUpperCase方法的那個對象當做參數,也就是lambda表達式s -> s.toUpperCase()中的s參數。所以也滿足一個輸入一個輸出的定義。
小結:本篇簡單介紹了函數式編程與stream api應用及類方法引用的使用,lambda表達式讓老版本的代碼更簡潔,方法引用讓lambda表達式更簡潔,實際上就是lambda表達式的一種語法糖。
下一篇
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/70674.html
摘要:僅在幾年以前,僅有少數的程序員知道函數式編程是什么。函數式編程是聲明性的而不是命令式的應用狀態流經純函數中。函數式編程是一種編程模式。在理解軟件是如何使用函數式編程構建時,理解函數組合是非常重要的一步。不可變性是函數式編程的核心概念。 函數式編程已然變成了一個javascript語言中一個非常熱門的話題。僅在幾年以前,僅有少數的js程序員知道函數式編程是什么。但是在過去三年中,我所見過...
摘要:函數式編程概述如今主流的編程語言,函數式編程范式或多或少都融入其中成了標配,或者說主流語言都在進行函數式方面的擴充,這是一個大趨勢。 showImg(https://segmentfault.com/img/remote/1460000015089083); 函數式編程概述 如今主流的編程語言,函數式編程范式或多或少都融入其中成了標配,或者說主流語言都在進行函數式方面的擴充,這是一...
摘要:但是,對函數式編程而言,這個行為的重要性是毋庸置疑的。關于該模式更正式的說法是偏函數嚴格來講是一個減少函數參數個數的過程這里的參數個數指的是希望傳入的形參的數量。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關于譯者:這是一個流淌著滬江血液的純粹工程:認真,是 HTML 最堅實的梁柱;分享,是...
摘要:我們將使用,這是一個現代,簡單,漂亮的框架,在內部使用并將響應式編程概念應用于前端編程。驅動程序采用從我們的應用程序發出數據的,它們返回另一個導致副作用的。我們將使用來呈現我們的應用程序。僅采用長度超過兩個字符的文本。 Rxjs 響應式編程-第一章:響應式Rxjs 響應式編程-第二章:序列的深入研究Rxjs 響應式編程-第三章: 構建并發程序Rxjs 響應式編程-第四章 構建完整的We...
閱讀 1729·2021-11-11 10:58
閱讀 4222·2021-09-09 09:33
閱讀 1269·2021-08-18 10:23
閱讀 1558·2019-08-30 15:52
閱讀 1636·2019-08-30 11:06
閱讀 1879·2019-08-29 14:03
閱讀 1518·2019-08-26 14:06
閱讀 2971·2019-08-26 10:39