Java8-四個函式式介面(Consumer,Supplier,Predicate,Function)
阿新 • • 發佈:2020-09-18
Java8---函式式介面
-
Consumer---消費者(accept方法,Lambda與方法引用返回都是Consumer)
-
Supplier---供給型(get方法,返回資料,與Optional可以聯用)
-
Predicate---謂詞性(test方法,起到判斷作用,)
-
Function---功能性(apply方法,轉換資料)
公司程式碼中看到過很多次Consumer和Function,一直搞不懂,今天做個整理,分成了匿名類,Lambda和方法引用
1.Consumer消費者
package Java; import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; import java.util.stream.Stream; /** * @ProjectName: Consumer_Test * @Package: Java * @Description: 消費者---Lambda和方法引用返回都是Consumer * @Author: huyuqiao * @CreateDate: 2020/9/18 18:10 */ /*① Consumer是一個介面,並且只要實現一個 accept 方法,就可以作為一個**“消費者”**輸出資訊。 ② 其實,lambda 表示式、方法引用的返回值都是 Consumer 型別,所以,他們能夠作為 forEach 方法的引數,並且輸出一個值。*/ public class Consumer_Test { public static void main(String[] args){ //匿名內部類 Consumer<String> consumer = new Consumer<String>() { @Override public void accept(String s) { System.out.println(s); } }; List list = new ArrayList(); Stream<String> stream = Stream.of("aaa", "bbb", "ccc", "ddd"); stream.forEach(consumer); System.out.println("********************"); //Lambda stream = Stream.of("aaa", "bbb", "ddd", "ccc", "fff"); Consumer<String> consumer1 = s -> System.out.println(s); stream.forEach(consumer1); System.out.println("********************"); //方法引用 stream = Stream.of("aaa", "bbb", "ddd", "ccc", "fff"); Consumer consumer2 = System.out::println; stream.forEach(consumer); } }
2.Supplier供應者
package Java; import com.sun.org.apache.bcel.internal.generic.NEW; import javax.swing.text.html.Option; import java.util.Optional; import java.util.Random; import java.util.function.Supplier; import java.util.stream.Stream; /** * @ProjectName: Supplier_Test * @Package: Java * @Description: 供給型-配合optional * @Author: huyuqiao * @CreateDate: 2020/9/18 18:47 */ /*① Supplier 介面可以理解為一個容器,用於裝資料的。 ② Supplier 介面有一個 get 方法,可以返回值。 */ public class Supplier_Test { public static void test_Supplier2(){ Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5); Optional<Integer> first = stream.filter(integer -> integer > 6).findFirst(); //orElse,如果first中存在數,就返回這個數,如果不存在,就放回傳入的數 System.out.println(first.orElse(777)); System.out.println("********************"); Supplier<Integer> supplier = new Supplier<Integer>() { @Override public Integer get() { return new Random().nextInt(); } }; //orElseGet,如果first中存在數,就返回這個數,如果不存在,就返回supplier返回的值 System.out.println(first.orElseGet(supplier)); } public static void test_Supplier(){ Supplier<Integer> supplier = new Supplier<Integer>() { @Override public Integer get() { return new Random().nextInt(); } }; System.out.println(supplier.get()); System.out.println("********************"); supplier = () -> new Random().nextInt(); System.out.println(supplier.get()); System.out.println("********************"); Supplier<Double> supplier1 = Math::random; System.out.println(supplier1.get()); } public static void main(String[] args){ test_Supplier2(); } }
3.Predicate謂詞性
package Java; import java.util.function.Predicate; /** * @ProjectName: Predicate_Test * @Package: Java * @Description: 謂詞型-判斷 * @Author: huyuqiao * @CreateDate: 2020/9/18 19:02 */ /*① Predicate 是一個謂詞型介面,其實只是起到一個判斷作用。 ② Predicate 通過實現一個 test 方法做判斷。*/ public class Predicate_Test { public static void main(String[] args){ Predicate<Integer> predicate = new Predicate<Integer>() { @Override public boolean test(Integer integer) { if (integer > 5){ return true; } else { return false; } } }; System.out.println(predicate.test(6)); System.out.println("********************"); predicate = integer -> integer > 5; System.out.println(predicate.test(5)); } }
4.Function功能性
package Java;
import java.util.function.Function;
import java.util.stream.Stream;
/**
* @ProjectName: Function_Test
* @Package: Java
* @Description:
* @Author: huyuqiao
* @CreateDate: 2020/9/18 19:12
*/
/*① Function 介面是一個功能型介面,是一個轉換資料(求長度,大小等)的作用。 ② Function 介面實現 apply 方法來做轉換。
*/
public class Function_Test {
public static void main(String[] args){
Function<String, Integer> function = new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return s.length();
}
};
Stream<String> stream = Stream.of("aaa", "bbbbb", "ccccccv");
Stream<Integer> stream1 = stream.map(function);
stream1.forEach(System.out::println);
}
}