最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年04月11日 09:32:36   作者:flydean  
這篇文章主要介紹了java中functional interface的分類和使用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

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

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

我們看一個(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"));

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

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

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

@FunctionalInterface
public 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ù)和返回值的不同,Functional Interface可以分為很多種,下面我們分別來介紹。

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

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

@FunctionalInterface
public 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:

@FunctionalInterface
public 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:

@FunctionalInterface
public 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:

@FunctionalInterface
public 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等。

@FunctionalInterface
public 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:

@FunctionalInterface
public interface Supplier<T> {

 /**
 * Gets a result.
 *
 * @return a result
 */
 T get();
}

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

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

@FunctionalInterface
public interface Consumer<T> {

 /**
 * Performs this operation on the given argument.
 *
 * @param t the input argument
 */
 void accept(T t);

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

//Consumer
nameMap.forEach((name, age) -> System.out.println(name + " is " + age + " years old"));

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

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

@FunctionalInterface
public 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等。

@FunctionalInterface
public 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)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中flatMap用法完整示例

    java中flatMap用法完整示例

    flatMap是java8的Stream流的一個(gè)方法,下面這篇文章主要給大家介紹了關(guān)于java中flatMap用法的相關(guān)資料,文中通過示例代碼和圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • Java設(shè)計(jì)模式之備忘錄模式使用詳解

    Java設(shè)計(jì)模式之備忘錄模式使用詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式中備忘錄模式的使用,備忘錄設(shè)計(jì)模式也叫作快照模式,主要用于實(shí)現(xiàn)防丟失、撤銷、恢復(fù)等功能,本文將通過示例為大家講解備忘錄模式的定義與使用,需要的同學(xué)可以參考一下
    2024-02-02
  • 布隆過濾器詳解以及其在Java中的實(shí)際應(yīng)用

    布隆過濾器詳解以及其在Java中的實(shí)際應(yīng)用

    布隆過濾器是一種數(shù)據(jù)結(jié)構(gòu),比較巧妙的概率型數(shù)據(jù)結(jié)構(gòu)(probabilistic data structure),特點(diǎn)是高效地插入和查詢,這篇文章主要給大家介紹了關(guān)于布隆過濾器詳解以及其在Java中的實(shí)際應(yīng)用,需要的朋友可以參考下
    2023-12-12
  • Java二叉樹的四種遍歷(遞歸和非遞歸)

    Java二叉樹的四種遍歷(遞歸和非遞歸)

    這篇文章主要介紹了Java二叉樹的四種遍歷,二叉樹的遍歷可以分為前序、中序、后序、層次遍歷,需要的朋友可以參考下
    2020-12-12
  • java類和對(duì)象原理與用法分析

    java類和對(duì)象原理與用法分析

    這篇文章主要介紹了java類和對(duì)象原理與用法,結(jié)合實(shí)例形式分析了java類和對(duì)象的相關(guān)概念、功能、原理、使用技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • Java?LocalTime的常用時(shí)間操作總結(jié)

    Java?LocalTime的常用時(shí)間操作總結(jié)

    日常開發(fā)中,?我們會(huì)經(jīng)常遇到時(shí)間的運(yùn)算,?操作,?格式化等,?這篇文章主要為大家詳細(xì)介紹了LocalTime的常用時(shí)間操作,感興趣的小伙伴可以了解一下
    2023-11-11
  • Android開發(fā)在輪播圖片上加入點(diǎn)擊事件的方法

    Android開發(fā)在輪播圖片上加入點(diǎn)擊事件的方法

    這篇文章主要介紹了Android開發(fā)在輪播圖片上加入點(diǎn)擊事件的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-11-11
  • java 獲取冒號(hào)后面的參數(shù)(正則)實(shí)現(xiàn)代碼

    java 獲取冒號(hào)后面的參數(shù)(正則)實(shí)現(xiàn)代碼

    這篇文章主要介紹了java 獲取冒號(hào)后面的參數(shù)(正則)實(shí)現(xiàn)代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(33)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(33)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • IDEA部署jeesite3完美運(yùn)行教程詳解

    IDEA部署jeesite3完美運(yùn)行教程詳解

    這篇文章主要介紹了IDEA部署jeesite3完美運(yùn)行教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09

最新評(píng)論

庐江县| 乳山市| 海伦市| 卢湾区| 宜阳县| 壤塘县| 富裕县| 娱乐| 璧山县| 瓮安县| 陆河县| 沭阳县| 卢湾区| 民丰县| 竹山县| 东阿县| 西和县| 濮阳县| 麟游县| 巧家县| 拜城县| 桦川县| 莱州市| 普安县| 阿合奇县| 德兴市| 吴旗县| 长春市| 达尔| 邵阳市| 长兴县| 清水河县| 天台县| 登封市| 肃南| 汶川县| 扶余县| 龙游县| 丹巴县| 静乐县| 浏阳市|