电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java 函數(shù)式編程要點總結

瀏覽:21日期:2022-08-10 11:57:23
目錄一、函數(shù)式概念二、函數(shù)與方法三、JDK函數(shù)基礎1、Lambda表達式2、函數(shù)式接口四、Optional類1、Null判斷2、Optional應用五、Stream流六、源代碼地址一、函數(shù)式概念

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

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

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

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

public class Function02 { public static void main(String[] args) {// 函數(shù)式計算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ù)式的編程風格側重描述程序的執(zhí)行邏輯,不是執(zhí)行過程。

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

二、函數(shù)與方法

在Java語言中有函數(shù)式編程風格,但是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ù)據(jù),這是最直觀的感覺。

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

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

三、JDK函數(shù)基礎1、Lambda表達式

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

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

public class Lambda01 { interface LambdaOpera {int operation(int a, int b); } public static void main(String[] args) {LambdaOpera lambdaOpera = new LambdaOpera(){ @Override public 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)); }}

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

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

在看一下Runnable接口的結構:

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

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

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

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

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

2、函數(shù)式接口

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

Function:輸入一個參數(shù),返回一個結果; Consumer:輸入一個參數(shù),不返回結果; BiFunction:輸入兩個參數(shù),返回一個結果; BiConsumer:輸入兩個參數(shù),不返回任何結果;

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); }}

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

四、Optional類1、Null判斷

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

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

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()); }} }}

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

2、Optional應用

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

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

所以在不明確對象的具體情況下,使用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結合鏈式方法和Lambda表達式就很大程度上簡化了應用的代碼量:

public class Optional04 { public static void main(String[] args) {// 1、map轉換方法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處理的各種方法,可以簡潔很多代碼判斷,但是在使用風格上和之前變化很大。

五、Stream流

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

Java 函數(shù)式編程要點總結

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

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ù)接口結合使用,函數(shù)接口又可以使用Lambda表達式進行簡化代碼。在Java8通過Stream可以大量簡化集合使用的代碼復雜度。

public class Stream02 { public static void main(String[] args) {// 1、轉換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轉換List<String> newList = list.stream().filter(str -> str.contains('+')).collect(Collectors.toList());newList.stream().forEach(System.out::print); }}

在沒有Stream相關API之前,對于集合的操作和遍歷都會產生大量的代碼,通過Stream相關API集合的函數(shù)式編程和Lambda表達式的風格,簡化集合很多操作。

六、源代碼地址

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

以上就是Java 函數(shù)式編程要點總結的詳細內容,更多關于Java 函數(shù)式編程的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 重庆小面培训_重庆小面技术培训学习班哪家好【终身免费复学】 | lcd条形屏-液晶长条屏-户外广告屏-条形智能显示屏-深圳市条形智能电子有限公司 | 中国产业发展研究网 - 提供行业研究报告 可行性研究报告 投资咨询 市场调研服务 | 超声波焊接机,振动摩擦焊接机,激光塑料焊接机,超声波焊接模具工装-德召尼克(常州)焊接科技有限公司 | 欧必特空气能-商用空气能热水工程,空气能热水器,超低温空气源热泵生产厂家-湖南欧必特空气能公司 | 除尘器布袋骨架,除尘器滤袋,除尘器骨架,电磁脉冲阀膜片,卸灰阀,螺旋输送机-泊头市天润环保机械设备有限公司 | 3A别墅漆/3A环保漆_广东美涂士建材股份有限公司【官网】 | 卓能JOINTLEAN端子连接器厂家-专业提供PCB接线端子|轨道式端子|重载连接器|欧式连接器等电气连接产品和服务 | 压力变送器-上海武锐自动化设备有限公司 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 球磨机,节能球磨机价格,水泥球磨机厂家,粉煤灰球磨机-吉宏机械制造有限公司 | 泰国试管婴儿_泰国第三代试管婴儿_泰国试管婴儿费用/多少钱_孕泰来 | 成都亚克力制品,PVC板,双色板雕刻加工,亚克力门牌,亚克力标牌,水晶字雕刻制作-零贰捌广告 | 精雕机-火花机-精雕机 cnc-高速精雕机-电火花机-广东鼎拓机械科技有限公司 | 光纤测温-荧光光纤测温系统-福州华光天锐光电科技有限公司 | 手术示教系统-数字化手术室系统-林之硕医疗云智能视频平台 | 成人纸尿裤,成人尿不湿,成人护理垫-山东康舜日用品有限公司 | 碳纤维布-植筋胶-灌缝胶-固特嘉加固材料公司 | 氧氮氢联合测定仪-联测仪-氧氮氢元素分析仪-江苏品彦光电 | 流水线电子称-钰恒-上下限报警电子秤-上海宿衡实业有限公司 | 钢木实验台-全钢实验台-化验室通风柜-实验室装修厂家-杭州博扬实验设备 | 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 纳米二氧化硅,白炭黑,阴离子乳化剂-臻丽拾科技 | 湖南档案密集架,智能,物证,移动,价格-湖南档案密集架厂家 | 粉碎机_塑料粉碎机_塑料破碎机厂家-星标机械 | PVC快速门-硬质快速门-洁净室快速门品牌厂家-苏州西朗门业 | 金属波纹补偿器厂家_不锈钢膨胀节价格_非金属伸缩节定制-庆达补偿器 | 河南凯邦机械制造有限公司| 环球周刊网| 企典软件一站式企业管理平台,可私有、本地化部署!在线CRM客户关系管理系统|移动办公OA管理系统|HR人事管理系统|人力 | 热处理炉-退火炉-回火炉设备厂家-丹阳市电炉厂有限公司 | 南京试剂|化学试剂|分析试剂|实验试剂|cas号查询-专业60年试剂销售企业 | 附着力促进剂-尼龙处理剂-PP处理剂-金属附着力处理剂-东莞市炅盛塑胶科技有限公司 | 咖啡加盟-咖啡店加盟-咖啡西餐厅加盟-塞纳左岸咖啡西餐厅官网 | 石英陶瓷,石英坩埚,二氧化硅陶瓷-淄博百特高新材料有限公司 | 带锯机|木工带锯机圆木推台锯|跑车带锯机|河北茂业机械制造有限公司| | 阜阳成人高考_阜阳成考报名时间_安徽省成人高考网| 长江船运_国内海运_内贸船运_大件海运|运输_船舶运输价格_钢材船运_内河运输_风电甲板船_游艇运输_航运货代电话_上海交航船运 | 江苏农村商业银行招聘网_2024江苏农商行考试指南_江苏农商行校园招聘 | 渣土车电机,太阳能跟踪器电机,蜗轮蜗杆减速电机厂家-淄博传强电机 |