一文帶你掌握J(rèn)ava8中函數(shù)式接口的使用和自定義
函數(shù)式接口是 Java 8 引入的一種接口,用于支持函數(shù)式編程。函數(shù)式接口通常包含一個(gè)抽象方法,可以被 Lambda 表達(dá)式或方法引用所實(shí)現(xiàn)。在本文中,我們將深入探討函數(shù)式接口的概念、用途以及如何創(chuàng)建和使用函數(shù)式接口。
什么是函數(shù)式接口
函數(shù)式接口是只包含一個(gè)抽象方法的接口。但是默認(rèn)方法和靜態(tài)方法在此接口中可以定義多個(gè)。Java 中的函數(shù)式接口可以被用作 Lambda 表達(dá)式的目標(biāo)類型。通過函數(shù)式接口,可以實(shí)現(xiàn)更簡(jiǎn)潔、更具可讀性的代碼,從而支持函數(shù)式編程的思想。
常見函數(shù)式接口
Java 中有一些內(nèi)置的函數(shù)式接口,用于不同的用途:
- Runnable: 用于描述可以在單獨(dú)線程中執(zhí)行的任務(wù)。
- Callable: 類似于 Runnable,但可以返回執(zhí)行結(jié)果或拋出異常。
- Comparator: 用于比較兩個(gè)對(duì)象的順序。
- Function: 接受一個(gè)參數(shù)并產(chǎn)生一個(gè)結(jié)果。
- Predicate: 接受一個(gè)參數(shù)并返回一個(gè)布爾值,用于判斷條件是否滿足。
- Supplier: 不接受參數(shù),但返回一個(gè)值。
自定義函數(shù)式接口
自定義函數(shù)式接口是需要在接口上添加 @FunctionalInterface
注解
定義 CustomFunctionalInterface 接口函數(shù)
@java.lang.FunctionalInterface public interface CustomFunctionalInterface { void execute(); }
在上述代碼中,定義了一個(gè)名為 CustomFunctionalInterface
的函數(shù)式接口,其中包含一個(gè)抽象方法 execute
,這是一個(gè)無(wú)參無(wú)返回值的方法。通過使用 @FunctionalInterface
注解,明確告訴編譯器這是一個(gè)函數(shù)式接口,確保它只包含一個(gè)抽象方法。
基于 CustomFunctionalInterface 使用
public class CustomFunctionInterfaceTest { public void test(CustomFunctionalInterface functionalInterface) { functionalInterface.execute(); } @Test public void execute() { test(() -> System.out.println("Hello World Custom!")); } }
在測(cè)試類 CustomFunctionInterfaceTest
中,定義了一個(gè)名為 test
的方法,接受一個(gè) CustomFunctionalInterface
參數(shù),并在方法體中調(diào)用了 execute
方法。這個(gè)方法允許將任意實(shí)現(xiàn)了 CustomFunctionalInterface
的 Lambda 表達(dá)式傳遞進(jìn)來(lái),并執(zhí)行其 execute
方法。
在測(cè)試方法 execute
中,通過調(diào)用 test
方法,傳遞了一個(gè) Lambda 表達(dá)式 () -> System.out.println("Hello World Custom!")
。這個(gè) Lambda 表達(dá)式實(shí)現(xiàn)了 CustomFunctionalInterface
的抽象方法 execute
,即打印了一條 "Hello World Custom!" 的消息。
常見函數(shù)式接口基本使用
Predicate
當(dāng)涉及到對(duì)集合或數(shù)據(jù)進(jìn)行篩選時(shí),Java 中的函數(shù)式接口 Predicate
可以發(fā)揮重要作用。Predicate
是一個(gè)通用的函數(shù)式接口,用于定義一個(gè)接受參數(shù)并返回布爾值的操作,用于判斷條件是否滿足。
Predicate 函數(shù)式接口
@FunctionalInterface public interface Predicate<T> { boolean test(T t); }
基于 Predicate 進(jìn)行篩選
import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; public class PredicateExample { public static List<String> filterStrings(List<String> list, Predicate<String> predicate) { List<String> filteredList = new ArrayList<>(); for (String str : list) { if (predicate.test(str)) { filteredList.add(str); } } return filteredList; } public static void main(String[] args) { List<String> stringList = List.of("apple", "banana", "cherry", "date", "elderberry"); Predicate<String> lengthPredicate = str -> str.length() > 5; List<String> longStrings = filterStrings(stringList, lengthPredicate); System.out.println("Long strings: " + longStrings); } }
在這個(gè)示例中,我們定義了一個(gè) filterStrings
方法,它接受一個(gè)字符串列表和一個(gè) Predicate
參數(shù),并返回符合條件的字符串列表。在 main
方法中,我們創(chuàng)建了一個(gè)長(zhǎng)度判斷的 Predicate
,然后使用它來(lái)篩選出長(zhǎng)度大于 5 的字符串。
Consumer
函數(shù)式接口 Consumer
在 Java 中用于表示接受一個(gè)參數(shù)并且沒有返回值的操作。它可以用于執(zhí)行一些對(duì)輸入數(shù)據(jù)的處理,例如打印、修改等。
Consumer 函數(shù)式接口
@FunctionalInterface public interface Consumer<T> { void accept(T t); }
基于 Consumer 進(jìn)行篩選
import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; public class ConsumerExample { public static void processIntegers(List<Integer> list, Consumer<Integer> consumer) { for (Integer num : list) { consumer.accept(num); } } public static void main(String[] args) { List<Integer> integerList = List.of(1, 2, 3, 4, 5); Consumer<Integer> squareAndPrint = num -> { int square = num * num; System.out.println("Square of " + num + " is: " + square); }; processIntegers(integerList, squareAndPrint); } }
在這個(gè)示例中,我們定義了一個(gè) filterStrings
方法,它接受一個(gè)字符串列表和一個(gè) Predicate
參數(shù),并返回符合條件的字符串列表。在 main
方法中,我們創(chuàng)建了一個(gè)長(zhǎng)度判斷的 Predicate
,然后使用它來(lái)篩選出長(zhǎng)度大于 5 的字符串。
在這個(gè)示例中,我們定義了一個(gè) processIntegers
方法,它接受一個(gè)整數(shù)列表和一個(gè) Consumer
參數(shù),并在方法內(nèi)遍歷列表,對(duì)每個(gè)元素執(zhí)行 accept
方法。在 main
方法中,我們創(chuàng)建了一個(gè) Consumer
實(shí)現(xiàn) squareAndPrint
,它會(huì)計(jì)算每個(gè)元素的平方并打印出來(lái)。
Function
函數(shù)式接口 Function
在 Java 中用于表示一個(gè)接受一個(gè)參數(shù)并產(chǎn)生一個(gè)結(jié)果的操作。它可以用于執(zhí)行各種轉(zhuǎn)換、映射和處理操作。
Function 函數(shù)式接口
Function
接口定義了一個(gè)名為 apply
的抽象方法,接受一個(gè)參數(shù)并返回一個(gè)結(jié)果。這個(gè)接口用于表示一個(gè)對(duì)輸入數(shù)據(jù)的轉(zhuǎn)換操作。
@FunctionalInterface public interface Function<T, R> { R apply(T t); }
在上述定義中,T
表示輸入類型,R
表示輸出類型。
基于 Function 進(jìn)行數(shù)據(jù)轉(zhuǎn)換
轉(zhuǎn)換為大寫
import java.util.function.Function; public class FunctionExample { public static String convertToUpperCase(String input, Function<String, String> function) { return function.apply(input); } public static void main(String[] args) { String original = "hello world"; String upperCase = convertToUpperCase(original, str -> str.toUpperCase()); System.out.println(upperCase); } }
在這個(gè)示例中,我們定義了一個(gè) convertToUpperCase
方法,它接受一個(gè)字符串和一個(gè) Function
參數(shù),用于將輸入字符串轉(zhuǎn)換為大寫。在 main
方法中,我們通過傳遞一個(gè) Function
實(shí)現(xiàn)來(lái)執(zhí)行轉(zhuǎn)換操作。
字符串長(zhǎng)度映射
import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; public class FunctionExample { public static List<Integer> mapStringLengths(List<String> list, Function<String, Integer> function) { return list.stream() .map(function) .collect(Collectors.toList()); } public static void main(String[] args) { List<String> strings = List.of("apple", "banana", "cherry", "date"); List<Integer> lengths = mapStringLengths(strings, str -> str.length()); System.out.println(lengths); } }
在這個(gè)示例中,我們定義了一個(gè) mapStringLengths
方法,它接受一個(gè)字符串列表和一個(gè) Function
參數(shù),用于將輸入字符串映射為它們的長(zhǎng)度。通過使用 map
操作,我們?cè)诹斜碇械拿總€(gè)字符串上執(zhí)行了長(zhǎng)度映射。
Supplier
函數(shù)式接口 Supplier
在 Java 中用于表示一個(gè)不接受參數(shù)但產(chǎn)生一個(gè)結(jié)果的操作。它通常用于延遲計(jì)算,只在需要時(shí)才執(zhí)行操作并生成結(jié)果。
Supplier 函數(shù)式接口
Supplier
接口定義了一個(gè)名為 get
的抽象方法,用于獲取一個(gè)結(jié)果。這個(gè)接口用于表示一個(gè)無(wú)參操作,只產(chǎn)生結(jié)果。
javaCopy code @FunctionalInterface public interface Supplier<T> { T get(); }
在上述定義中,T
表示結(jié)果的類型
基于 Supplier 進(jìn)行延遲計(jì)算
隨機(jī)數(shù)生成
import java.util.Random; import java.util.function.Supplier; public class SupplierExample { public static int generateRandomNumber(Supplier<Integer> supplier) { return supplier.get(); } public static void main(String[] args) { Supplier<Integer> randomSupplier = () -> new Random().nextInt(100); int randomNumber = generateRandomNumber(randomSupplier); System.out.println("Random number: " + randomNumber); } }
在這個(gè)示例中,我們定義了一個(gè) generateRandomNumber
方法,它接受一個(gè) Supplier
參數(shù),并通過調(diào)用 get
方法獲取隨機(jī)數(shù)。在 main
方法中,我們創(chuàng)建了一個(gè)隨機(jī)數(shù)生成的 Supplier
,然后將它傳遞給 generateRandomNumber
方法來(lái)獲取隨機(jī)數(shù)。
延遲初始化
import java.util.function.Supplier; public class SupplierExample { private String expensiveResource = null; public String getExpensiveResource(Supplier<String> supplier) { if (expensiveResource == null) { expensiveResource = supplier.get(); } return expensiveResource; } public static void main(String[] args) { Supplier<String> resourceSupplier = () -> { System.out.println("Initializing expensive resource..."); return "Expensive Resource"; }; SupplierExample example = new SupplierExample(); System.out.println(example.getExpensiveResource(resourceSupplier)); System.out.println(example.getExpensiveResource(resourceSupplier)); } }
在這個(gè)示例中,我們定義了一個(gè) getExpensiveResource
方法,它接受一個(gè) Supplier
參數(shù),并使用延遲初始化的方式獲取昂貴的資源。在 main
方法中,我們創(chuàng)建了一個(gè)資源初始化的 Supplier
,然后多次調(diào)用 getExpensiveResource
方法,觀察只有在需要時(shí)才會(huì)初始化資源。
到此這篇關(guān)于一文帶你掌握J(rèn)ava8中函數(shù)式接口的使用和自定義的文章就介紹到這了,更多相關(guān)Java8函數(shù)式接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(52)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧,希望可以幫到你2021-08-08使用list stream: 任意對(duì)象List拼接字符串
這篇文章主要介紹了使用list stream:任意對(duì)象List拼接字符串操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Spring Boot 統(tǒng)一數(shù)據(jù)返回格式的解決方案
統(tǒng)?的數(shù)據(jù)返回格式使? @ControllerAdvice 和 ResponseBodyAdvice 的?式實(shí)現(xiàn),下面給大家分享Spring Boot 統(tǒng)一數(shù)據(jù)返回格式的解決方案,感興趣的朋友一起看看吧2024-03-03intellij idea14打包apk文件和查看sha1值
這篇文章主要為大家詳細(xì)介紹了intellij idea14打包apk文件和查看sha1值,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10Java8 Stream API 詳細(xì)使用方法與操作技巧指南
這篇文章主要介紹了Java8 Stream API 詳細(xì)使用方法與操作技巧,總結(jié)分析了Java8 Stream API 基本功能、使用方法與操作注意事項(xiàng),需要的朋友可以參考下2020-05-05