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

您的位置:首頁技術(shù)文章
文章詳情頁

淺談對(duì)Java雙冒號(hào)::的理解

瀏覽:100日期:2022-08-30 17:39:12

本文為個(gè)人理解,不保證完全正確。官方文檔中將雙冒號(hào)的用法分為4類,按照我的個(gè)人理解可以分成2類來使用。

官方文檔

官方文檔中將雙冒號(hào)的用法分為了以下4類:

用法 舉例 引用靜態(tài)方法 ContainingClass::staticMethodName 引用特定對(duì)象的實(shí)例方法 containingObject::instanceMethodName 引用特定類型的任意對(duì)象的實(shí)例方法 ContainingType::methodName 引用構(gòu)造函數(shù) ClassName::new

以下是我的理解

個(gè)人理解

雙冒號(hào)的作用

在使用雙冒號(hào)前我們要先搞清楚一個(gè)問題:為什么要使用雙冒號(hào)?也就是雙冒號(hào)的作用是什么。雙冒號(hào)的設(shè)計(jì)初衷是為了化簡(jiǎn)Lambda表達(dá)式,不熟悉Lambda表達(dá)式的同學(xué)可以先了解一下。Lambda表達(dá)式的形式有兩種:

包含單獨(dú)表達(dá)式 :parameters -> an expression

list.forEach(item -> System.out.println(item));

包含代碼塊:parameters -> { expressions }

list.forEach(item -> { int numA = item.getNumA(); int numB = item.getNumB(); System.out.println(numA + numB);});

使用雙冒號(hào)可以省略第一種Lambda表達(dá)式中的參數(shù)部分,即item ->和調(diào)用方法的參數(shù)這兩部分。

例如:

//不使用雙冒號(hào)list.forEach(item -> System.out.println(item));//使用雙冒號(hào)list.forEach(System.out::println);

雙冒號(hào)的使用條件

使用雙冒號(hào)有兩個(gè)條件:

條件1條件1為必要條件,必須要滿足這個(gè)條件才能使用雙冒號(hào)。Lambda表達(dá)式內(nèi)部只有一條表達(dá)式(第一種Lambda表達(dá)式),并且這個(gè)表達(dá)式只是調(diào)用已經(jīng)存在的方法,不做其他的操作。

條件2由于雙冒號(hào)是為了省略item ->這一部分,所以條件2是需要滿足不需要寫參數(shù)item也知道如何使用item的情況。有兩種情況可以滿足這個(gè)要求,這就是我將雙冒號(hào)的使用分為2類的依據(jù)。

情況 舉例 Lambda表達(dá)式的參數(shù)與調(diào)用函數(shù)的參數(shù)完全一致 list.forEach(item -> System.out.println(item)) 調(diào)用的函數(shù)是參數(shù)item對(duì)象的方法且沒有參數(shù) list.stream().map(item -> item.getId())

一些栗子

Lambda表達(dá)式的參數(shù)與調(diào)用函數(shù)的參數(shù)完全一致時(shí)

靜態(tài)方法調(diào)用

//化簡(jiǎn)前l(fā)ist.forEach(item -> System.out.println(item));//化簡(jiǎn)后list.forEach(System.out::println);

非靜態(tài)方法調(diào)用

StringBuilder stringBuilder = new StringBuilder();//化簡(jiǎn)前IntStream.range(1, 101).forEach(item -> stringBuilder.append(item));//化簡(jiǎn)后IntStream.range(1, 101).forEach(stringBuilder::append);

調(diào)用構(gòu)造方法

官方給出的例子

先定義一個(gè)方法,這個(gè)方法的作用是將一個(gè)集合的內(nèi)容復(fù)制到另一個(gè)集合

public <T, SOURCE extends Collection<T>, DEST extends Collection<T>>DEST transferElements(SOURCE sourceCollection, Supplier<DEST> collectionFactory) { DEST result = collectionFactory.get(); result.addAll(sourceCollection); return result;}

調(diào)用這個(gè)方法

//化簡(jiǎn)前Set<Person> rosterSetLambda = transferElements(roster, () -> new HashSet<>());//化簡(jiǎn)后Set<Person> rosterSet = transferElements(roster, HashSet::new);

稍微解釋一下:

調(diào)用時(shí)傳入的Lambda表達(dá)式相當(dāng)于是對(duì)Supplier的繼承,并重寫Supplier的get()方法,下面是Supplier的源碼:

@FunctionalInterfacepublic interface Supplier<T> { /** * Gets a result. * * @return a result */ T get();}

在transferElements()方法中調(diào)用collectionFactory.get()時(shí)相當(dāng)于調(diào)用重寫后的方法{return new HashSet<>();}

我自己寫的一個(gè)例子

第一個(gè)類:

@Datapublic class ModelA { private String id; public ModelA(String id) { this.id = id; } public ModelA() { }}

第二個(gè)類

class ClassB { private final List<ModelA> list = new ArrayList<>(); public void add(String string, Function<String, ModelA> function) { list.add(function.apply(string)); }}

測(cè)試代碼

ClassB classB = new ClassB();d//化簡(jiǎn)前classB.add('ddd', item -> new ModelA(item));//化簡(jiǎn)后classB.add('ddd', ModelA::new);

調(diào)用的函數(shù)是參數(shù)item對(duì)象的方法且沒有參數(shù)時(shí)

//化簡(jiǎn)前List<String> stringList = list.stream().map(item -> item.getId()).collect(Collectors.toList());//化簡(jiǎn)后List<String> stringList = list.stream().map(ModelA::getId).collect(Collectors.toList());

一種特殊情況

除了上述兩種情況可以使用雙冒號(hào)化簡(jiǎn)Lambda表達(dá)式外,還存在一種特殊情況也可以使用雙冒號(hào)。當(dāng)Lambda表達(dá)式的參數(shù)有兩個(gè)(形如(a,b) -> an expression)時(shí),調(diào)用a的方法參數(shù)為b時(shí),例如:

String[] stringArray = {'Barbara', 'James', 'Mary', 'John'};//化簡(jiǎn)前Arrays.sort(stringArray, (a,b) -> a.compareToIgnoreCase(b));//化簡(jiǎn)后Arrays.sort(stringArray, String::compareToIgnoreCase);

到此這篇關(guān)于淺談對(duì)Java雙冒號(hào)::的理解的文章就介紹到這了,更多相關(guān)Java雙冒號(hào)::內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 脑钠肽-白介素4|白介素8试剂盒-研域(上海)化学试剂有限公司 | 经济师考试_2025中级经济师报名时间_报名入口_考试时间_华课网校经济师培训网站 | 神超官网_焊接圆锯片_高速钢锯片_硬质合金锯片_浙江神超锯业制造有限公司 | 环境模拟实验室_液体-气体控温机_气体控温箱_无锡双润冷却科技有限公司 | 超声波焊接机,振动摩擦焊接机,激光塑料焊接机,超声波焊接模具工装-德召尼克(常州)焊接科技有限公司 | LINK FASHION 童装·青少年装展 河南卓美创业科技有限公司-河南卓美防雷公司-防雷接地-防雷工程-重庆避雷针-避雷器-防雷检测-避雷带-避雷针-避雷塔、机房防雷、古建筑防雷等-山西防雷公司 | 工装定制/做厂家/公司_工装订做/制价格/费用-北京圣达信工装 | 不锈钢酒柜|恒温酒柜|酒柜定制|酒窖定制-上海啸瑞实业有限公司 | 废气处理设备-工业除尘器-RTO-RCO-蓄热式焚烧炉厂家-江苏天达环保设备有限公司 | 北京百度网站优化|北京网站建设公司-百谷网络科技 | 杭州营业执照代办-公司变更价格-许可证办理流程_杭州福道财务管理咨询有限公司 | 气动机械手-搬运机械手-气动助力机械手-山东精瑞自动化设备有限公司 | 圆窗水平仪|伊莉莎冈特elesa+ganter| 合肥白癜风医院_[治疗白癜风]哪家好_合肥北大白癜风医院 | 成都治疗尖锐湿疣比较好的医院-成都治疗尖锐湿疣那家医院好-成都西南皮肤病医院 | 中空玻璃生产线,玻璃加工设备,全自动封胶线,铝条折弯机,双组份打胶机,丁基胶/卧式/立式全自动涂布机,玻璃设备-山东昌盛数控设备有限公司 | 全自动翻转振荡器-浸出式水平振荡器厂家-土壤干燥箱价格-常州普天仪器 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | 中视电广_短视频拍摄_短视频推广_短视频代运营_宣传片拍摄_影视广告制作_中视电广 | 臭氧实验装置_实验室臭氧发生器-北京同林臭氧装置网 | pos机办理,智能/扫码/二维码/微信支付宝pos机-北京万汇通宝商贸有限公司 | 合肥抖音SEO网站优化-网站建设-网络推广营销公司-百度爱采购-安徽企匠科技 | 档案密集架_电动密集架_移动密集架_辽宁档案密集架-盛隆柜业厂家现货批发销售价格公道 | 石家庄装修设计_室内家装设计_别墅装饰装修公司-石家庄金舍装饰官网 | 天津蒸汽/热水锅炉-电锅炉安装维修直销厂家-天津鑫淼暖通设备有限公司 | 无锡不干胶标签,卷筒标签,无锡瑞彩包装材料有限公司 | 学生作文网_中小学生作文大全与写作指导 | 大倾角皮带机-皮带输送机-螺旋输送机-矿用皮带输送机价格厂家-河南坤威机械 | 【星耀裂变】_企微SCRM_任务宝_视频号分销裂变_企业微信裂变增长_私域流量_裂变营销 | 【直乐】河北石家庄脊柱侧弯医院_治疗椎间盘突出哪家医院好_骨科脊柱外科专业医院_治疗抽动症/关节病骨伤权威医院|排行-直乐矫形中医医院 | 南京欧陆电气股份有限公司-风力发电机官网 | 网站优化公司_北京网站优化_抖音短视频代运营_抖音关键词seo优化排名-通则达网络 | 防爆电机-高压防爆电机-ybx4电动机厂家-河南省南洋防爆电机有限公司 | 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | 金属检测机_金属分离器_检针验针机_食品药品金属检探测仪器-广东善安科技 | 假肢-假肢价格-假肢厂家-河南假肢-郑州市力康假肢矫形器有限公司 | 环讯传媒,永康网络公司,永康网站建设,永康小程序开发制作,永康网站制作,武义网页设计,金华地区网站SEO优化推广 - 永康市环讯电子商务有限公司 | 棕刚玉-白刚玉厂家价格_巩义市东翔净水材料厂| 纸箱抗压机,拉力机,脂肪测定仪,定氮仪-山东德瑞克仪器有限公司 | 股票入门基础知识_股票知识_股票投资大师_格雷厄姆网 | 能量回馈_制动单元_电梯节能_能耗制动_深圳市合兴加能科技有限公司 |