日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java中functional interface的分类和使用

發布時間:2024/2/28 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中functional interface的分类和使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 簡介
  • Functional Interface
  • Function:一個參數一個返回值
  • BiFunction:接收兩個參數,一個返回值
  • Supplier:無參的Function
  • Consumer:接收一個參數,不返回值
  • Predicate:接收一個參數,返回boolean
  • Operator:接收和返回同樣的類型
  • 總結

簡介

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

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

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

//ExecutorService using classExecutorService executorService = Executors.newSingleThreadExecutor();executorService.submit(new Runnable() {@Overridepublic void run() {log.info("new runnable");}});

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

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

//ExecutorService using lambdaexecutorService.submit(()->log.info("new runnable"));

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

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

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

@FunctionalInterface public 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接口定義了一個方法,接收一個參數,返回一個參數。

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

一般我們在對集合類進行處理的時候,會用到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:

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

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

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

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

我們看一個BiFunction的例子:

//BiFunctionMap<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:

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

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

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

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

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

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

//PredicateList<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);

我們看一個BinaryOperator的例子:

//OperatorList<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

更多精彩內容且看:

  • 區塊鏈從入門到放棄系列教程-涵蓋密碼學,超級賬本,以太坊,Libra,比特幣等持續更新
  • Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續更新
  • Spring 5.X系列教程:滿足你對Spring5的一切想象-持續更新
  • java程序員從小工到專家成神之路(2020版)-持續更新中,附詳細文章教程

更多內容請訪問 www.flydean.com

總結

以上是生活随笔為你收集整理的java中functional interface的分类和使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。