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

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

java中functional interface的分類和使用詳解

瀏覽:65日期:2022-09-03 08:49:01

java 8引入了lambda表達式,lambda表達式實際上表示的就是一個匿名的function。

在java 8之前,如果需要使用到匿名function需要new一個類的實現,但是有了lambda表達式之后,一切都變的非常簡介。

我們看一個之前講線程池的時候的一個例子:

//ExecutorService using class ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.submit(new Runnable() { @Override public void run() { log.info('new runnable'); } });

executorService.submit需要接收一個Runnable類,上面的例子中我們new了一個Runnable類,并實現了它的run()方法。

上面的例子如果用lambda表達式來重寫,則如下所示:

//ExecutorService using lambda executorService.submit(()->log.info('new runnable'));

看起是不是很簡單,使用lambda表達式就可以省略匿名類的構造,并且可讀性更強。

那么是不是所有的匿名類都可以用lambda表達式來重構呢?也不是。

我們看下Runnable類有什么特點:

@FunctionalInterfacepublic interface Runnable

Runnable類上面有一個@FunctionalInterface注解。這個注解就是我們今天要講到的Functional Interface。

Functional Interface

Functional Interface是指帶有 @FunctionalInterface 注解的interface。它的特點是其中只有一個子類必須要實現的abstract方法。如果abstract方法前面帶有default關鍵字,則不做計算。

其實這個也很好理解,因為Functional Interface改寫成為lambda表達式之后,并沒有指定實現的哪個方法,如果有多個方法需要實現的話,就會有問題。

@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface FunctionalInterface {}

Functional Interface一般都在java.util.function包中。

根據要實現的方法參數和返回值的不同,Functional Interface可以分為很多種,下面我們分別來介紹。

Function:一個參數一個返回值

Function接口定義了一個方法,接收一個參數,返回一個參數。

@FunctionalInterfacepublic interface Function<T, R> { /** * Applies this function to the given argument. * * @param t the function argument * @return the function result */ R apply(T t);

一般我們在對集合類進行處理的時候,會用到Function。

Map<String, Integer> nameMap = new HashMap<>(); Integer value = nameMap.computeIfAbsent('name', s -> s.length());

上面的例子中我們調用了map的computeIfAbsent方法,傳入一個Function。

上面的例子還可以改寫成更短的:

Integer value1 = nameMap.computeIfAbsent('name', String::length);

Function沒有指明參數和返回值的類型,如果需要傳入特定的參數,則可以使用IntFunction, LongFunction, DoubleFunction:

@FunctionalInterfacepublic interface IntFunction<R> { /** * Applies this function to the given argument. * * @param value the function argument * @return the function result */ R apply(int value);}

如果需要返回特定的參數,則可以使用ToIntFunction, ToLongFunction, ToDoubleFunction:

@FunctionalInterfacepublic interface ToDoubleFunction<T> { /** * Applies this function to the given argument. * * @param value the function argument * @return the function result */ double applyAsDouble(T value);}

如果要同時指定參數和返回值,則可以使用DoubleToIntFunction, DoubleToLongFunction, IntToDoubleFunction, IntToLongFunction, LongToIntFunction, LongToDoubleFunction:

@FunctionalInterfacepublic interface LongToIntFunction { /** * Applies this function to the given argument. * * @param value the function argument * @return the function result */ int applyAsInt(long value);}

BiFunction:接收兩個參數,一個返回值

如果需要接受兩個參數,一個返回值的話,可以使用BiFunction:BiFunction, ToDoubleBiFunction, ToIntBiFunction, ToLongBiFunction等。

@FunctionalInterfacepublic interface BiFunction<T, U, R> { /** * Applies this function to the given arguments. * * @param t the first function argument * @param u the second function argument * @return the function result */ R apply(T t, U u);

我們看一個BiFunction的例子:

//BiFunction Map<String, Integer> salaries = new HashMap<>(); salaries.put('alice', 100); salaries.put('jack', 200); salaries.put('mark', 300); salaries.replaceAll((name, oldValue) -> name.equals('alice') ? oldValue : oldValue + 200);

Supplier:無參的Function

如果什么參數都不需要,則可以使用Supplier:

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

Consumer:接收一個參數,不返回值

Consumer接收一個參數,但是不返回任何值,我們看下Consumer的定義:

@FunctionalInterfacepublic interface Consumer<T> { /** * Performs this operation on the given argument. * * @param t the input argument */ void accept(T t);

看一個Consumer的具體應用:

//ConsumernameMap.forEach((name, age) -> System.out.println(name + ' is ' + age + ' years old'));

Predicate:接收一個參數,返回boolean

Predicate接收一個參數,返回boolean值:

@FunctionalInterfacepublic interface Predicate<T> { /** * Evaluates this predicate on the given argument. * * @param t the input argument * @return {@code true} if the input argument matches the predicate, * otherwise {@code false} */ boolean test(T t);

如果用在集合類的過濾上面那是極好的:

//Predicate List<String> names = Arrays.asList('A', 'B', 'C', 'D', 'E'); List<String> namesWithA = names.stream() .filter(name -> name.startsWith('A')) .collect(Collectors.toList());

Operator:接收和返回同樣的類型

Operator接收和返回同樣的類型,有很多種Operator:UnaryOperator BinaryOperator ,DoubleUnaryOperator, IntUnaryOperator, LongUnaryOperator, DoubleBinaryOperator, IntBinaryOperator, LongBinaryOperator等。

@FunctionalInterfacepublic interface IntUnaryOperator { /** * Applies this operator to the given operand. * * @param operand the operand * @return the operator result */ int applyAsInt(int operand);

我們看一個BinaryOperator的例子:

//Operator List<Integer> values = Arrays.asList(1, 2, 3, 4, 5); int sum = values.stream() .reduce(0, (i1, i2) -> i1 + i2);

Functional Interface是一個非常有用的新特性,希望大家能夠掌握。

本文的例子:https://github.com/ddean2009/learn-java-streams/tree/master/functional-interface

總結

到此這篇關于java中functional interface的分類和使用詳解的文章就介紹到這了,更多相關java中functional interface的分類和使用內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
主站蜘蛛池模板: 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 动库网动库商城-体育用品专卖店:羽毛球,乒乓球拍,网球,户外装备,运动鞋,运动包,运动服饰专卖店-正品运动品网上商城动库商城网 - 动库商城 | 不锈钢闸阀_球阀_蝶阀_止回阀_调节阀_截止阀-可拉伐阀门(上海)有限公司 | 谈股票-今日股票行情走势分析-牛股推荐排行榜 | 东莞动力锂电池保护板_BMS智能软件保护板_锂电池主动均衡保护板-东莞市倡芯电子科技有限公司 | 江苏皓越真空设备有限公司| 江苏皓越真空设备有限公司 | 餐饮小吃技术培训-火锅串串香培训「何小胖培训」_成都点石成金[官网] | 都江堰招聘网-都江堰人才网 都江堰人事人才网 都江堰人才招聘网 邢台人才网_邢台招聘网_邢台123招聘【智达人才网】 | elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 | jrs高清nba(无插件)直播-jrs直播低调看直播-jrs直播nba-jrs直播 上海地磅秤|电子地上衡|防爆地磅_上海地磅秤厂家–越衡称重 | 一航网络-软件测评官网 | 密度电子天平-内校-外校电子天平-沈阳龙腾电子有限公司 | 橡胶接头_橡胶软接头_套管伸缩器_管道伸缩器厂家-巩义市远大供水材料有限公司 | 屏蔽服(500kv-超高压-特高压-电磁)-徐吉电气 | led冷热冲击试验箱_LED高低温冲击试验箱_老化试验箱-爱佩百科 | 山东成考网-山东成人高考网 | 碳纤维复合材料制品生产定制工厂订制厂家-凯夫拉凯芙拉碳纤维手机壳套-碳纤维雪茄盒外壳套-深圳市润大世纪新材料科技有限公司 | 柔软云母板-硬质-水位计云母片组件-首页-武汉长丰云母绝缘材料有限公司 | 淘趣英语网 - 在线英语学习,零基础英语学习网站 | 招商帮-一站式网络营销服务|互联网整合营销|网络推广代运营|信息流推广|招商帮企业招商好帮手|搜索营销推广|短视视频营销推广 | 沈阳建筑设计公司_加固改造设计_厂房设计_设计资质加盟【金辉设计】 | 酒万铺-酒水招商-酒水代理 | 西安标准厂房_陕西工业厂房_西咸新区独栋厂房_长信科技产业园官方网站 | Safety light curtain|Belt Sway Switches|Pull Rope Switch|ultrasonic flaw detector-Shandong Zhuoxin Machinery Co., Ltd | 小型铜米机-干式铜米机-杂线全自动铜米机-河南鑫世昌机械制造有限公司 | 减速机三参数组合探头|TSM803|壁挂式氧化锆分析仪探头-安徽鹏宸电气有限公司 | 精密光学实验平台-红外粉末压片机模具-天津博君 | 江苏农村商业银行招聘网_2024江苏农商行考试指南_江苏农商行校园招聘 | 天津电机维修|水泵维修-天津晟佳机电设备有限公司 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | 青岛成人高考_山东成考报名网 | 3d打印服务,3d打印汽车,三维扫描,硅胶复模,手板,快速模具,深圳市精速三维打印科技有限公司 | 陕西安玻璃自动感应门-自动重叠门-磁悬浮平开门厂家【捷申达门业】 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 广州印刷厂_广州彩印厂-广州艺彩印务有限公司 | 交流伺服电机|直流伺服|伺服驱动器|伺服电机-深圳市华科星电气有限公司 | 浇钢砖,流钢砖_厂家价低-淄博恒森耐火材料有限公司 | 智能终端_RTU_dcm_北斗星空自动化科技 | 全自动在线分板机_铣刀式在线分板机_曲线分板机_PCB分板机-东莞市亿协自动化设备有限公司 |