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

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

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

瀏覽:126日期: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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
麻豆精品av| 日韩av在线中文字幕| 中文在线免费视频| 日韩av有码| 亚洲专区视频| 欧美亚洲tv| 91精品二区| 国产一区亚洲| 婷婷综合网站| 欧美一区二区三区激情视频| 伊人精品一区| 噜噜噜躁狠狠躁狠狠精品视频| 蜜臀久久久99精品久久久久久| 亚洲精品婷婷| 国产精品videossex| 日韩av在线播放网址| 欧美.日韩.国产.一区.二区| 视频在线在亚洲| 国产日韩精品视频一区二区三区| 免费一区二区三区在线视频| 亚洲成人一区在线观看| 一区二区精品| 日本一区二区高清不卡| 国产精品丝袜xxxxxxx| 亚洲精品无播放器在线播放| 久久久国产精品网站| 蜜臀91精品国产高清在线观看| 成人看片网站| av中文字幕在线观看第一页| 亚洲精品99| 奇米777国产一区国产二区| 成人精品高清在线视频| 免费精品视频| 国产盗摄——sm在线视频| 另类av一区二区| 丝袜诱惑一区二区| 国产毛片精品久久| 中文亚洲免费| 久久精品国内一区二区三区水蜜桃| 野花国产精品入口| 欧美久久天堂| 国产美女视频一区二区| 在线观看一区| 好吊日精品视频| 成人日韩精品| 成人国产精品| 欧美精品成人| 欧美欧美黄在线二区| 99热精品在线观看| 久久青草久久| 日韩在线视频精品| 国产aⅴ精品一区二区三区久久| 国产色噜噜噜91在线精品| 久久国产精品久久w女人spa| 日韩在线中文| 丁香六月综合| 久久久久午夜电影| 97精品国产| 国产精品一区二区av日韩在线| 亚洲专区视频| 日韩高清三区| 国产日韩一区二区三区在线播放| 亚洲色图综合| 日本不卡视频在线观看| 日韩不卡在线观看日韩不卡视频 | 女同性一区二区三区人了人一| 午夜精品成人av| 久久网站免费观看| 久久激情中文| 精品欧美久久| 一区二区三区网站| 日本中文字幕不卡| 人人爱人人干婷婷丁香亚洲| 国产伦精品一区二区三区视频 | 97精品一区| 激情久久久久久| 久久午夜精品| 日本午夜精品久久久| 国产在线观看91一区二区三区| 91亚洲国产成人久久精品| 国产一区二区三区四区五区传媒| 中文字幕在线看片| 日韩一级欧洲| 久久的色偷偷| 欧美粗暴jizz性欧美20| 日韩精品一区第一页| 国产精品久久久一区二区| 日韩欧美一区免费| 日本v片在线高清不卡在线观看| 国产乱码精品一区二区三区亚洲人 | 日韩国产一区二区| 先锋亚洲精品| 日本不卡高清视频| 国产精品99视频| 视频一区中文字幕国产| 久久字幕精品一区| 蜜臀久久久久久久| 成人在线视频区| 一区二区日韩免费看| 另类中文字幕国产精品| 久久国产欧美日韩精品| 在线日韩一区| 麻豆国产精品一区二区三区| 日本欧洲一区二区| 国产精品一区二区免费福利视频| 麻豆精品蜜桃视频网站| 99综合视频| 国产一区二区三区亚洲综合| 美女网站久久| 久久视频精品| 亚洲黄色中文字幕| 国产精品一区二区三区www| 午夜亚洲一区| 亚洲欧洲午夜| 日韩不卡免费高清视频| 国产精品亚洲一区二区在线观看| 尤物网精品视频| 91精品一区二区三区综合| 美女视频黄久久| 国产乱码精品一区二区三区亚洲人| 奶水喷射视频一区| 亚洲国产一区二区在线观看 | 99久久99视频只有精品| 福利一区视频| 欧美激情福利| 国产精品高清一区二区| 国产一精品一av一免费爽爽| 日韩欧美中文字幕一区二区三区| 鲁大师成人一区二区三区| 香蕉久久国产| 国产毛片久久| 综合一区二区三区| 日韩av一二三| 久久激五月天综合精品| 亚洲精品进入| 久久中文精品| 综合精品一区| 日本精品在线播放| 久久99影视| 日本欧美不卡| 日韩视频久久| 日韩综合小视频| 国产日韩欧美在线播放不卡| 蜜桃久久久久| 九九久久婷婷| 免费久久精品视频| 日本欧美大码aⅴ在线播放| 久久97视频| av中文字幕在线观看第一页| 天堂资源在线亚洲| 亚洲少妇一区| 国产精品毛片视频| 狠狠操综合网| 青青伊人久久| 欧美综合另类| 国产伦理久久久久久妇女| 成人欧美一区二区三区的电影| 久久福利毛片| 高清久久一区| 97久久超碰| 五月天久久777| 国产精品22p| 久久一二三区| 精品国产乱码久久久久久樱花| 欧美99久久| 精品少妇av| 日欧美一区二区| 欧美日韩日本国产亚洲在线| 久久精品午夜| 日日摸夜夜添夜夜添国产精品| 偷拍精品精品一区二区三区| 国产日韩欧美一区二区三区在线观看| 久久一区二区三区电影| 青青草精品视频| 亚洲一区二区动漫| 91日韩在线| 麻豆久久一区| 欧美精品福利| 国产亚洲精品v| 久久激情一区| 欧美天堂视频| 欧美一级鲁丝片| 精品三级国产| 美女国产精品久久久| 国产欧美在线观看免费| 日韩区一区二| 亚洲欧美在线综合| 日韩精品一二三区| 免费视频一区二区| 视频一区欧美精品| 亚洲在线成人| 久久午夜视频| 日韩中文av| 亚洲欧美网站在线观看| 青草av.久久免费一区| 欧美久久亚洲| 精品日韩在线| 午夜久久中文| 亚洲高清av| 在线观看一区|