日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java基础篇(05):函数式编程概念和应用

發(fā)布時(shí)間:2025/3/16 java 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java基础篇(05):函数式编程概念和应用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文源碼:GitHub·點(diǎn)這里 || GitEE·點(diǎn)這里

文章目錄

  • 一、函數(shù)式概念
  • 二、函數(shù)與方法
  • 三、JDK函數(shù)基礎(chǔ)
    • 1、Lambda表達(dá)式
    • 2、函數(shù)式接口
  • 四、Optional類
    • 1、Null判斷
    • 2、Optional應(yīng)用
  • 五、Stream流
  • 六、源代碼地址

一、函數(shù)式概念

函數(shù)式編程是一種結(jié)構(gòu)化編程的范式,主要思想是把運(yùn)算過程盡量寫成系列嵌套的函數(shù)調(diào)用。函數(shù)編程的概念表述帶有很抽象的感覺,可以基于案例看:

public class Function01 {public static void main(String[] args) {// 運(yùn)算:(x+y)* cint x1 = 2 ;int y1 = 3 ;int c1 = 4 ;int sum1 = x1 + y1 ;int res1 = sum1 * c1 ;System.out.println("res1 = "+res1);} }

這里基于過程的方式做計(jì)算,上面的代碼塊著重在描述程序執(zhí)行過程。

在看基于函數(shù)的方式解決方法:

public class Function02 {public static void main(String[] args) {// 函數(shù)式計(jì)算System.out.println("func01 = "+func01(2,3,4));}private static int func01 (int x,int y,int c){return (x+y)*c;} }

函數(shù)式編程的核心要素:傳入?yún)?shù),執(zhí)行邏輯,返回值,也可以沒有返回值。

函數(shù)式的編程風(fēng)格側(cè)重描述程序的執(zhí)行邏輯,不是執(zhí)行過程。

同上面計(jì)算過程相比,函數(shù)式編程也減少很多臨時(shí)變量的創(chuàng)建,代碼風(fēng)格也變的簡(jiǎn)潔清楚。

二、函數(shù)與方法

在Java語言中有函數(shù)式編程風(fēng)格,但是Java代碼中沒有函數(shù)的說法,而是稱為:方法;

public class Function03 {public static void main(String[] args) {Func03 func03 = new Func03();func03.add(2);System.out.println(func03.res1);} } class Func03 {public int res1 = 0 ;public void add (int a1){this.res1 = a1 +1 ;} }

類定義引用數(shù)據(jù)類型,類實(shí)例化后的對(duì)象可以調(diào)用類內(nèi)部的方法和數(shù)據(jù),這是最直觀的感覺。

但是方法又有靜態(tài)和非靜態(tài)的區(qū)別,靜態(tài)方法屬于類所有,類實(shí)例化前即可使用。

非靜態(tài)方法可以訪問類中的任何成員變量和方法,并且必須是類實(shí)例化后的對(duì)象才可以調(diào)用。

三、JDK函數(shù)基礎(chǔ)

1、Lambda表達(dá)式

Lambda表達(dá)式也可稱為閉包,是推動(dòng)Java8發(fā)布的最重要新特性,允許把函數(shù)作為一個(gè)方法的參數(shù)(函數(shù)作為參數(shù)傳遞進(jìn)方法中)。

這里就很鮮明的對(duì)比Lambda表達(dá)式語法和傳統(tǒng)用法。

public class Lambda01 {interface LambdaOpera {int operation(int a, int b);}public static void main(String[] args) {LambdaOpera lambdaOpera = new LambdaOpera(){@Overridepublic int operation(int a, int b) {return a * b ;}};System.out.println(lambdaOpera.operation(3,2));LambdaOpera lambdaOpera01 = (int a, int b) -> a + b;LambdaOpera lambdaOpera02 = (int a, int b) -> a - b;System.out.println(lambdaOpera01.operation(3,2));System.out.println(lambdaOpera02.operation(3,2));} }

在看一個(gè)直觀的應(yīng)用案例,基于Lambda的方式創(chuàng)建線程,可以使代碼變的更加簡(jiǎn)潔緊湊:

public class Lambda02 {public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 2; i++) {System.out.println(i);}}}).start();// 對(duì)比 Lambda 方式new Thread(() -> {for (int i = 0; i < 2; i++) {System.out.println(i);}}).start();} }

在看一下Runnable接口的結(jié)構(gòu):

FunctionalInterface標(biāo)記在接口上,表示該接口是函數(shù)式接口,并且該接口只包含一個(gè)抽象方法,

@FunctionalInterface public interface Runnable {public abstract void run(); }

Lambda表達(dá)式本身可以理解為就是一個(gè)接口的實(shí)現(xiàn)過程,這里runnable就是完整的Lambda表達(dá)式聲明:

public class Lambda04 {public static void main(String[] args) {Runnable runnable = () -> {System.out.println("run one...");};Thread thread = new Thread(runnable);thread.start();} }

Lambda表達(dá)式最直觀的作用就是使得代碼變得異常簡(jiǎn)潔,并且可以作為參數(shù)傳遞。

2、函數(shù)式接口

Lambda表達(dá)式雖然有很多優(yōu)點(diǎn),但是使用的時(shí)候需要定義一些接口用來完成編碼,這樣又使得表達(dá)式又變得重量級(jí),Java8自身已經(jīng)提供幾個(gè)常見的函數(shù)式接口。

  • Function:輸入一個(gè)參數(shù),返回一個(gè)結(jié)果;
  • Consumer:輸入一個(gè)參數(shù),不返回結(jié)果;
  • BiFunction:輸入兩個(gè)參數(shù),返回一個(gè)結(jié)果;
  • BiConsumer:輸入兩個(gè)參數(shù),不返回任何結(jié)果;
public class Lambda05 {public static void main(String[] args) {Function<Integer, Integer> function01 = x -> x * 2;System.out.println(function01.apply(2));BiFunction<Integer, Integer, Integer> function02 = (x, y) -> x * y;System.out.println(function02.apply(2, 3));Consumer<String> consumer01 = msg -> System.out.println("msg:"+msg);consumer01.accept("hello");BiConsumer<String,Integer> consumer02 = (msg,i)-> System.out.println(msg+":"+i);consumer02.accept("world",3);} }

如果面對(duì)更復(fù)雜的業(yè)務(wù)需求,可以自定義函數(shù)式接口去解決。

四、Optional類

1、Null判斷

Optional類是Java函數(shù)式編程的應(yīng)用,主要用來解決常見的空指針異常問題。

在Java編程的開發(fā)中,很多地方都能常見空指針異常的拋出,如果想避免這個(gè)問題就要加入很多判斷:

public class Optional01 {public static void main(String[] args) {User user = new User(1,"hello") ;if (user != null){if (user.getName() != null){System.out.println(user.getName());}}} }

為了確保程序不拋出空指針這種低級(jí)的錯(cuò)誤,在程序中隨處可以null的判斷,代碼顯然冗余和繁雜。

2、Optional應(yīng)用

基于Optional類創(chuàng)建的對(duì)象可能包含空值和null值,也同樣會(huì)拋出對(duì)應(yīng)的異常:

public class Optional02 {public static void main(String[] args) {// NoSuchElementExceptionOptional<User> optionalUser = Optional.empty();optionalUser.get();// NullPointerExceptionOptional<User> nullOpt = Optional.of(null);nullOpt.get();} }

所以在不明確對(duì)象的具體情況下,使用ofNullable()方法:

public class Optional03 {public static void main(String[] args) {User user = new User(1,"say");Optional<User> optionalUser = Optional.ofNullable(user);if (optionalUser.isPresent()){System.out.println(optionalUser.get().getName());}User user1 = null ;User createUser = Optional.ofNullable(user1).orElse(createUser());System.out.println(createUser.getName());User user2 = null ;Optional.ofNullable(user2).orElseThrow( ()-> new RuntimeException());;}public static User createUser (){return new User(2,"hello") ;} }

這樣看下來Optional結(jié)合鏈?zhǔn)椒椒ê蚅ambda表達(dá)式就很大程度上簡(jiǎn)化了應(yīng)用的代碼量:

public class Optional04 {public static void main(String[] args) {// 1、map轉(zhuǎn)換方法User user = new User(99, "Java");// user = null ;String name = Optional.ofNullable(user).map(u -> u.getName()).orElse("c++");System.out.println(name);// 2、過濾方法Optional<User> optUser01 = Optional.ofNullable(user).filter(u -> u.getName() != null && u.getName().contains("c++"));// NoSuchElementExceptionSystem.out.println(optUser01.get().getName());} }

Optional提供null處理的各種方法,可以簡(jiǎn)潔很多代碼判斷,但是在使用風(fēng)格上和之前變化很大。

五、Stream流

如果Optional簡(jiǎn)化很多Null的判斷,那Stream流的API則簡(jiǎn)化了很多集合的遍歷判斷,同樣也是基于函數(shù)式編程。

上述為Stream接口繼承關(guān)系如圖,同樣提供一些特定接口和較大的包裝接口,通過源碼查看,可以看到和函數(shù)編程也是密切相關(guān)。

public class Stream01 {public static void main(String[] args) {Stream<String> stream = Stream.of("hello", "java");stream.forEach(str -> System.out.print(str+";"));} }

Stream與函數(shù)接口結(jié)合使用,函數(shù)接口又可以使用Lambda表達(dá)式進(jìn)行簡(jiǎn)化代碼。在Java8通過Stream可以大量簡(jiǎn)化集合使用的代碼復(fù)雜度。

public class Stream02 {public static void main(String[] args) {// 1、轉(zhuǎn)換StreamList<String> list = Arrays.asList("java+;", "c++;", "net;");list.stream();// 2、forEach操作list.stream().forEach(System.out::print);// 3、map映射,輸出 3,4IntStream.rangeClosed(2,3).map(x->x+1).forEach(System.out::println);// 4、filter過濾list.stream().filter(str -> str.contains("+")).forEach(System.out::print);// 5、distinct去重Integer[] arr = new Integer[]{3, 1, 3, 1, 2,4};Stream.of(arr).distinct().forEach(System.out::println);// 6、sorted排序Stream.of(arr).sorted().forEach(System.out::println);// 7、collect轉(zhuǎn)換List<String> newList = list.stream().filter(str -> str.contains("+")).collect(Collectors.toList());newList.stream().forEach(System.out::print);} }

在沒有Stream相關(guān)API之前,對(duì)于集合的操作和遍歷都會(huì)產(chǎn)生大量的代碼,通過Stream相關(guān)API集合的函數(shù)式編程和Lambda表達(dá)式的風(fēng)格,簡(jiǎn)化集合很多操作。

六、源代碼地址

GitHub·地址 https://github.com/cicadasmile/java-base-parent GitEE·地址 https://gitee.com/cicadasmile/java-base-parent

閱讀標(biāo)簽

【Java基礎(chǔ)】【設(shè)計(jì)模式】【結(jié)構(gòu)與算法】【Linux系統(tǒng)】【數(shù)據(jù)庫】

【分布式架構(gòu)】【微服務(wù)】【大數(shù)據(jù)組件】【SpringBoot進(jìn)階】【Spring&Boot基礎(chǔ)】

【數(shù)據(jù)分析】【技術(shù)導(dǎo)圖】【 職場(chǎng)】

總結(jié)

以上是生活随笔為你收集整理的Java基础篇(05):函数式编程概念和应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 落日余晖 | 中文字幕在线视频网站 | 亚洲天堂免费 | 成人资源在线观看 | 青青草97 | 美女羞羞动态图 | 轮番上阵免费观看在线电影 | 91精品国产综合久久香蕉 | 国产精品久久久久久久久岛 | 97自拍视频 | 影音先锋中文字幕资源 | 7m精品福利视频导航 | 黑人乱码一区二区三区av | 95视频在线 | 寂寞午夜影院 | 久草高清 | 久久成人av| 日本熟女一区二区 | 一级网站在线观看 | 欧美一级黄色片在线观看 | 国产女同视频 | 国产欧美一区二 | 欧美性猛烈 | 岛国片在线免费观看 | 成人片黄网站久久久免费 | 日韩高清专区 | 国产人妻久久精品一区二区三区 | 日韩国产在线播放 | 国产精品国产三级国产aⅴ下载 | av中文网站 | 国产婷婷色综合av蜜臀av | 亚洲tv在线| 污视频网站在线观看 | 99精品福利 | 久久接色 | 在线观看成人 | 黑人性xxx| 午夜影院在线视频 | 在线一区视频 | 国产妞干网 | 亚洲国产精品二区 | 国产夜夜操 | 国产精品91久久 | 久久91| 51妺嘿嘿午夜福利 | 午夜少妇视频 | 色一区二区三区 | 中文字幕在线观看第二页 | 国产精品成人免费一区二区视频 | 在线a级| 免费激情 | 日韩精品一区二区在线看 | 丰满少妇aaaaaa爰片毛片 | 国产玖玖视频 | 国精产品乱码一区一区三区四区 | 久久久久久久久久久久久久久久久 | 亚洲成人精品视频 | 欧美大片免费 | 日韩精品中文字幕在线观看 | 高清毛片aaaaaaaaa郊外 | 福利在线观看 | 中文字幕乱码视频 | 国产草草影院ccyycom | 欧美极品视频在线观看 | jizz欧洲| 天天做天天干 | 亚洲高清视频一区二区 | 黄色免费国产 | 波多野结衣欧美 | 黄色一几片 | 午夜婷婷 | 精品黄色 | 波多野结衣视频在线 | 在线观看黄网址 | 少妇无码一区二区三区 | 手机看片国产1024 | 碰在线视频 | 国产精品伦理一区二区 | 久久久国产成人一区二区三区 | 潘金莲裸体一级淫片视频 | 亚洲爱视频 | 翔田千里一区二区 | 国模在线观看 | 欧美成人免费一级人片100 | 一区二区三区日韩视频 | 天天干天天谢 | 全黄一级男人和女人 | 污污的视频软件 | 五月天av网站 | 美女131爽爽爽做爰视频 | 西川结衣在线观看 | 久久久久久久久久久久久久av | 国产xxxx| 亚洲第二色 | 波多野结衣a v在线 欧洲免费av | 久久婷香 | 国内毛片毛片毛片毛片 | 一色道久久88加勒比一 | 性爱动漫 |