日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

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

java 8引入了lambda表達(dá)式,lambda表達(dá)式實(shí)際上表示的就是一個(gè)匿名的function。

在java 8之前,如果需要使用到匿名function需要new一個(gè)類的實(shí)現(xiàn),但是有了lambda表達(dá)式之后,一切都變的非常簡介。

我們看一個(gè)之前講線程池的時(shí)候的一個(gè)例子:

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

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

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

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

看起是不是很簡單,使用lambda表達(dá)式就可以省略匿名類的構(gòu)造,并且可讀性更強(qiáng)。

那么是不是所有的匿名類都可以用lambda表達(dá)式來重構(gòu)呢?也不是。

我們看下Runnable類有什么特點(diǎn):

@FunctionalInterfacepublic interface Runnable

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

Functional Interface

Functional Interface是指帶有 @FunctionalInterface 注解的interface。它的特點(diǎn)是其中只有一個(gè)子類必須要實(shí)現(xiàn)的abstract方法。如果abstract方法前面帶有default關(guān)鍵字,則不做計(jì)算。

其實(shí)這個(gè)也很好理解,因?yàn)镕unctional Interface改寫成為lambda表達(dá)式之后,并沒有指定實(shí)現(xiàn)的哪個(gè)方法,如果有多個(gè)方法需要實(shí)現(xiàn)的話,就會(huì)有問題。

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

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

根據(jù)要實(shí)現(xiàn)的方法參數(shù)和返回值的不同,F(xiàn)unctional Interface可以分為很多種,下面我們分別來介紹。

Function:一個(gè)參數(shù)一個(gè)返回值

Function接口定義了一個(gè)方法,接收一個(gè)參數(shù),返回一個(gè)參數(shù)。

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

一般我們?cè)趯?duì)集合類進(jìn)行處理的時(shí)候,會(huì)用到Function。

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

上面的例子中我們調(diào)用了map的computeIfAbsent方法,傳入一個(gè)Function。

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

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

Function沒有指明參數(shù)和返回值的類型,如果需要傳入特定的參數(shù),則可以使用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);}

如果需要返回特定的參數(shù),則可以使用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);}

如果要同時(shí)指定參數(shù)和返回值,則可以使用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:接收兩個(gè)參數(shù),一個(gè)返回值

如果需要接受兩個(gè)參數(shù),一個(gè)返回值的話,可以使用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);

我們看一個(gè)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

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

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

Consumer:接收一個(gè)參數(shù),不返回值

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

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

看一個(gè)Consumer的具體應(yīng)用:

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

Predicate:接收一個(gè)參數(shù),返回boolean

Predicate接收一個(gè)參數(shù),返回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);

我們看一個(gè)BinaryOperator的例子:

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

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

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

總結(jié)

到此這篇關(guān)于java中functional interface的分類和使用詳解的文章就介紹到這了,更多相關(guān)java中functional interface的分類和使用內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
最新国产精品视频| 亚洲毛片一区| 久久久亚洲欧洲日产| 一区二区精彩视频| 美女尤物久久精品| 蜜臀精品久久久久久蜜臀 | 国产一级久久| 亚洲激情另类| 综合色就爱涩涩涩综合婷婷| 蜜乳av另类精品一区二区| 在线观看视频免费一区二区三区| 婷婷激情图片久久| 欧美日韩激情在线一区二区三区| 激情综合自拍| 免费日韩视频| 午夜久久av | 婷婷丁香综合| 九九在线精品| 日韩免费福利视频| 999国产精品| 欧产日产国产精品视频| 亚州av乱码久久精品蜜桃| 在线日韩中文| 国产精品黄色| 精品国产亚洲日本| 国内一区二区三区| 欧美福利在线| 久久精品国产成人一区二区三区| 国产成人精品三级高清久久91| 日韩中文字幕一区二区三区| 高清在线一区| 日本一区二区三区视频在线看| 欧美午夜不卡| 91久久视频| 国产精品777777在线播放| 电影亚洲精品噜噜在线观看| 亚洲综合精品四区| 久久免费福利| 国产精品网址| 久久国产免费| 欧美欧美黄在线二区| 欧美va天堂| 国产aa精品| 91精品福利观看| 亚洲欧美不卡| 久久精品国产www456c0m| 久久久精品国产**网站| 免费不卡在线观看| 久久久久蜜桃| 国产一区二区三区精品在线观看 | 久久成人av| 亚洲色图国产| 久久亚洲在线| 国产欧美日韩视频在线| 久久国产精品久久久久久电车| 人人草在线视频| 国产精品手机在线播放| 亚洲人成毛片在线播放女女| 欧美性感美女一区二区| 久久久久九九精品影院| 日韩av一区二区三区四区| 欧美不卡视频| 日韩精品dvd| 精品亚洲成人| 国产精品中文| 欧美亚洲免费| 日韩二区三区在线观看| 美美哒免费高清在线观看视频一区二区| 天堂中文在线播放| 国产精品tv| 欧美视频久久| 视频一区视频二区在线观看| 激情久久久久久| 亚洲一级少妇| 理论片午夜视频在线观看| 麻豆精品视频在线| 国产精品亚洲片在线播放| 日本综合视频| 日韩精品免费视频人成| 综合亚洲视频| 麻豆9191精品国产| 伊人久久亚洲美女图片| 亚洲91视频| 在线手机中文字幕| 狠狠躁少妇一区二区三区| 精品视频97| 国产一区福利| 欧美国产视频| 美日韩一区二区三区| 国产精品久久久久久久久免费高清| 日韩精品午夜视频| 亚洲a级精品| 免播放器亚洲| 日韩中文欧美在线| 中文字幕日韩欧美精品高清在线| 在线综合亚洲| 模特精品在线| 亚洲精品美女| 日韩国产91| 日本99精品| 国产精品久久久久9999高清| 国产精品扒开腿做爽爽爽软件| 国产极品久久久久久久久波多结野 | 欧美国产不卡| 麻豆精品在线播放| 美女久久精品| 亚洲综合电影| 亚洲成人精品| 亚洲一区二区三区四区五区午夜| 免费在线观看成人| 综合激情五月婷婷| 日韩福利在线观看| 麻豆中文一区二区| 人人草在线视频| 好看不卡的中文字幕| 蜜芽一区二区三区| 国产乱子精品一区二区在线观看 | 日本aⅴ亚洲精品中文乱码| 青草国产精品| 久久精品亚洲| 日韩精品麻豆| 亚洲欧美高清| 欧美日韩一视频区二区| 久久亚洲精精品中文字幕| 91av亚洲| 亚洲综合精品| 国产日韩欧美| 在线一区av| 国产亚洲毛片| 国产探花在线精品| 黄毛片在线观看| 激情91久久| 日韩精品中文字幕一区二区| 国产精品欧美三级在线观看 | 欧美日韩尤物久久| 国产精品美女久久久浪潮软件| 欧美精品三级在线| 日韩不卡在线| 日韩动漫一区| 日韩久久电影| 亚洲精品福利| 精品资源在线| 亚洲精华国产欧美| 911亚洲精品| 日韩专区精品| 亚洲精品一二| 97欧美在线视频| 中文亚洲免费| 国产精品欧美在线观看| 欧美亚洲在线日韩| 国产亚洲观看| 亚洲先锋成人| 国产精品流白浆在线观看| 极品日韩av| 国产精品激情电影| 午夜国产欧美理论在线播放| 日韩激情一区二区| 色88888久久久久久影院| 亚洲久久一区| 丝袜诱惑一区二区| 日本成人在线网站| 久久九九99| 日本aⅴ亚洲精品中文乱码| 国产成人精品亚洲日本在线观看| 日韩欧美2区| 久久免费国产| 国产乱码精品| 视频一区欧美日韩| 日韩免费视频| 97精品国产99久久久久久免费| 亚洲a一区二区三区| 国产精品一区二区99| 在线综合亚洲| 色在线视频观看| 国产日韩欧美中文在线| 午夜欧美精品| 黄色网一区二区| 日韩在线卡一卡二| 日韩欧美精品一区| 欧美综合精品| 久久精品国内一区二区三区水蜜桃| 欧美日韩一区二区三区不卡视频| 激情六月综合| 精品视频91| 日本欧美韩国一区三区| 亚洲精品小说| 91亚洲人成网污www| 不卡一区综合视频| 美女福利一区二区三区| 美女久久久久久| 97成人在线| 日韩专区欧美专区| 久久久久久黄| 在线天堂资源www在线污| 国产精品香蕉| 亚洲日本欧美| 久久亚洲图片| 国产一区二区精品| 亚洲精品午夜av福利久久蜜桃| 欧美xxxx中国|