自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java8之Consumer、Supplier、Predicate和Function攻略

新聞 前端
來聊聊Consumer、Supplier、Predicate、Function這幾個接口的用法,在 Java8 的用法當中,這幾個接口雖然沒有明目張膽的使用,但是,卻是潤物細無聲的。

來聊聊Consumer、Supplier、Predicate、Function這幾個接口的用法,在 Java8 的用法當中,這幾個接口雖然沒有明目張膽的使用,但是,卻是潤物細無聲的。為什么這么說呢?

這幾個接口都在 java.util.function 包下的,分別是Consumer(消費型)、supplier(供給型)、predicate(謂詞型)、function(功能性),相信有了后面的解釋,你應該非常清楚這個接口的功能了。

那么,下面,我們從具體的應用場景來講講這個接口的用法!

1 Consumer接口

從字面意思上我們就可以看得出啦,consumer接口就是一個消費型的接口,通過傳入?yún)?shù),然后輸出值,就是這么簡單,Java8 的一些方法看起來很抽象,其實,只要你理解了就覺得很好用,并且非常的簡單。

我們下面就先看一個例子,然后再來分析這個接口。

1.1 Consumer實例

  1. /** 
  2.  * consumer接口測試 
  3.  */ 
  4.  @Test 
  5.  public void test_Consumer() { 
  6.  //① 使用consumer接口實現(xiàn)方法 
  7.  Consumer<String> consumer = new Consumer<String>() { 
  8.  @Override 
  9.  public void accept(String s) { 
  10.  System.out.println(s); 
  11.  } 
  12.  }; 
  13.  Stream<String> stream = Stream.of("aaa""bbb""ddd""ccc""fff"); 
  14.  stream.forEach(consumer); 
  15.  System.out.println("********************"); 
  16.  //② 使用lambda表達式,forEach方法需要的就是一個Consumer接口 
  17.  stream = Stream.of("aaa""bbb""ddd""ccc""fff"); 
  18.  Consumer<String> consumer1 = (s) -> System.out.println(s);//lambda表達式返回的就是一個Consumer接口 
  19.  stream.forEach(consumer1); 
  20.  //更直接的方式 
  21.  //stream.forEach((s) -> System.out.println(s)); 
  22.  System.out.println("********************"); 
  23.  //③ 使用方法引用,方法引用也是一個consumer 
  24.  stream = Stream.of("aaa""bbb""ddd""ccc""fff"); 
  25.  Consumer consumer2 = System.out::println; 
  26.  stream.forEach(consumer); 
  27.  //更直接的方式 
  28.  //stream.forEach(System.out::println); 
  29.  } 

輸出結(jié)果

Java8之Consumer、Supplier、Predicate和Function攻略,建議收藏

1.2 實例分析

① consumer接口分析

在代碼①中,我們直接創(chuàng)建 Consumer 接口,并且實現(xiàn)了一個名為 accept 的方法,這個方法就是這個接口的關(guān)鍵了。

我們看一下 accept 方法;這個方法傳入一個參數(shù),不返回值。當我們發(fā)現(xiàn) forEach 需要一個 Consumer 類型的參數(shù)的時候,傳入之后,就可以輸出對應的值了。

② lambda 表達式作為 consumer

  1. Consumer<String> consumer1 = (s) -> System.out.println(s);//lambda表達式返回的就是一個Consumer接口 

在上面的代碼中,我們使用下面的 lambda 表達式作為 Consumer。仔細的看一下你會發(fā)現(xiàn),lambda 表達式返回值就是一個 Consumer;所以,你也就能夠理解為什么 forEach 方法可以使用 lamdda 表達式作為參數(shù)了吧。

③ 方法引用作為 consumer

  1. Consumer consumer2 = System.out::println; 

在上面的代碼中,我們用了一個方法引用的方式作為一個 Consumer ,同時也可以傳給 forEach 方法。

1.3 其他 Consumer 接口

除了上面使用的 Consumer 接口,還可以使用下面這些 Consumer 接口。 IntConsumer、DoubleConsumer、LongConsumer、BiConsumer,使用方法和上面一樣。

1.4 Consumer 總結(jié)

看完上面的實例我們可以總結(jié)為幾點。

① Consumer是一個接口,并且只要實現(xiàn)一個 accept 方法,就可以作為一個**“消費者”**輸出信息。 ② 其實,lambda 表達式、方法引用的返回值都是 Consumer 類型,所以,他們能夠作為 forEach 方法的參數(shù),并且輸出一個值。

2 Supplier 接口

Supplier 接口是一個供給型的接口,其實,說白了就是一個容器,可以用來存儲數(shù)據(jù),然后可以供其他方法使用的這么一個接口,是不是很明白了,如果還是不明白,看看下面的例子,一定徹底搞懂!

2.1 Supplier實例

  1. ** 
  2.  * Supplier接口測試,supplier相當一個容器或者變量,可以存儲值 
  3.  */ 
  4.  @Test 
  5.  public void test_Supplier() { 
  6.  //① 使用Supplier接口實現(xiàn)方法,只有一個get方法,無參數(shù),返回一個值 
  7.  Supplier<Integer> supplier = new Supplier<Integer>() { 
  8.  @Override 
  9.  public Integer get() { 
  10.  //返回一個隨機值 
  11.  return new Random().nextInt(); 
  12.  } 
  13.  }; 
  14.  System.out.println(supplier.get()); 
  15.  System.out.println("********************"); 
  16.  //② 使用lambda表達式, 
  17.  supplier = () -> new Random().nextInt(); 
  18.  System.out.println(supplier.get()); 
  19.  System.out.println("********************"); 
  20.  //③ 使用方法引用 
  21.  Supplier<Double> supplier2 = Math::random; 
  22.  System.out.println(supplier2.get()); 
  23.  } 

輸出結(jié)果

Java8之Consumer、Supplier、Predicate和Function攻略,建議收藏

2.2 實例分析

① Supplier接口分析

  1. Supplier<Integer> supplier = new Supplier<Integer>() { 
  2.  @Override 
  3.  public Integer get() { 
  4.  //返回一個隨機值 
  5.  return new Random().nextInt(); 
  6.  } 
  7.  }; 

看一下這段代碼,我們通過創(chuàng)建一個 Supplier 對象,實現(xiàn)了一個 get 方法,這個方法無參數(shù),返回一個值;所以,每次使用這個接口的時候都會返回一個值,并且保存在這個接口中,所以說是一個容器。

② lambda表達式作為 Supplier

  1. //② 使用lambda表達式, 
  2.  supplier = () -> new Random().nextInt(); 
  3.  System.out.println(supplier.get()); 
  4.  System.out.println("********************"); 

上面的這段代碼,我們使用 lambda 表達式返回一個 Supplier類型的接口,然后,我們調(diào)用 get 方法就可以獲取這個值了。

③ 方法引用作為 Supplier

  1. //③ 使用方法引用 
  2.  Supplier<Double> supplier2 = Math::random; 
  3.  System.out.println(supplier2.get()); 
  4. 復制代碼 

方法引用也是返回一個Supplier類型的接口。

2.3 Supplier 實例2

我們看完第一個實例之后,我們應該有一個了解了,下面再看一個。

  1. /** 
  2.  * Supplier接口測試2,使用需要Supplier的接口方法 
  3.  */ 
  4.  @Test 
  5.  public void test_Supplier2() { 
  6.  Stream<Integer> stream = Stream.of(12345); 
  7.  //返回一個optional對象 
  8.  Optional<Integer> first = stream.filter(i -> i > 4
  9.  .findFirst(); 
  10.  //optional對象有需要Supplier接口的方法 
  11.  //orElse,如果first中存在數(shù),就返回這個數(shù),如果不存在,就放回傳入的數(shù) 
  12.  System.out.println(first.orElse(1)); 
  13.  System.out.println(first.orElse(7)); 
  14.  System.out.println("********************"); 
  15.  Supplier<Integer> supplier = new Supplier<Integer>() { 
  16.  @Override 
  17.  public Integer get() { 
  18.  //返回一個隨機值 
  19.  return new Random().nextInt(); 
  20.  } 
  21.  }; 
  22.  //orElseGet,如果first中存在數(shù),就返回這個數(shù),如果不存在,就返回supplier返回的值 
  23.  System.out.println(first.orElseGet(supplier)); 
  24.  } 

輸出結(jié)果

Java8之Consumer、Supplier、Predicate和Function攻略,建議收藏

代碼分析

  1. Optional<Integer> first = stream.filter(i -> i > 4
  2.  .findFirst(); 

使用這個方法獲取到一個 Optional 對象,然后,在 Optional 對象中有 orElse 方法 和 orElseGet 是需要一個 Supplier 接口的。

  1. //optional對象有需要Supplier接口的方法 
  2.  //orElse,如果first中存在數(shù),就返回這個數(shù),如果不存在,就放回傳入的數(shù) 
  3.  System.out.println(first.orElse(1)); 
  4.  System.out.println(first.orElse(7)); 
  5.  System.out.println("********************"); 
  6.  Supplier<Integer> supplier = new Supplier<Integer>() { 
  7.  @Override 
  8.  public Integer get() { 
  9.  //返回一個隨機值 
  10.  return new Random().nextInt(); 
  11.  } 
  12.  }; 
  13.  //orElseGet,如果first中存在數(shù),就返回這個數(shù),如果不存在,就返回supplier返回的值 
  14.  System.out.println(first.orElseGet(supplier)); 
  • orElse:如果first中存在數(shù),就返回這個數(shù),如果不存在,就放回傳入的數(shù)
  • orElseGet:如果first中存在數(shù),就返回這個數(shù),如果不存在,就返回supplier返回的值

2.4 其他 Supplier 接口

除了上面使用的 Supplier 接口,還可以使用下面這些 Supplier 接口。 IntSupplier 、DoubleSupplier 、LongSupplier 、BooleanSupplier,使用方法和上面一樣。

2.5 Supplier 總結(jié)

① Supplier 接口可以理解為一個容器,用于裝數(shù)據(jù)的。 ② Supplier 接口有一個 get 方法,可以返回值。

3 Predicate 接口

Predicate 接口是一個謂詞型接口,其實,這個就是一個類似于 bool 類型的判斷的接口,后面看看就明白了。

3.1 Predicate 實例

  1. /** 
  2.  * Predicate謂詞測試,謂詞其實就是一個判斷的作用類似bool的作用 
  3.  */ 
  4.  @Test 
  5.  public void test_Predicate() { 
  6.  //① 使用Predicate接口實現(xiàn)方法,只有一個test方法,傳入一個參數(shù),返回一個bool值 
  7.  Predicate<Integer> predicate = new Predicate<Integer>() { 
  8.  @Override 
  9.  public boolean test(Integer integer) { 
  10.  if(integer > 5){ 
  11.  return true
  12.  } 
  13.  return false
  14.  } 
  15.  }; 
  16.  System.out.println(predicate.test(6)); 
  17.  System.out.println("********************"); 
  18.  //② 使用lambda表達式, 
  19.  predicate = (t) -> t > 5
  20.  System.out.println(predicate.test(1)); 
  21.  System.out.println("********************"); 
  22.  } 

輸出結(jié)果

Java8之Consumer、Supplier、Predicate和Function攻略,建議收藏

3.2 實例分析

① Predicate 接口分析

  1. //① 使用Predicate接口實現(xiàn)方法,只有一個test方法,傳入一個參數(shù),返回一個bool值 
  2.  Predicate<Integer> predicate = new Predicate<Integer>() { 
  3.  @Override 
  4.  public boolean test(Integer integer) { 
  5.  if(integer > 5){ 
  6.  return true
  7.  } 
  8.  return false
  9.  } 
  10.  }; 

這段代碼中,創(chuàng)建了一個 Predicate 接口對象,其中,實現(xiàn)類 test 方法,需要傳入一個參數(shù),并且返回一個 bool 值,所以這個接口作用就是判斷!

  1. System.out.println(predicate.test(6)); 

再看,調(diào)用 test 方法,傳入一個值,就會返回一個 bool 值。

② 使用lambda表達式作為 predicate

  1. //② 使用lambda表達式, 
  2.  predicate = (t) -> t > 5
  3.  System.out.println(predicate.test(1)); 
  4.  System.out.println("********************"); 

lambda 表達式返回一個 Predicate 接口,然后調(diào)用 test 方法!

3.3 Predicate 接口實例2

  1. /** 
  2.  * Predicate謂詞測試,Predicate作為接口使用 
  3.  */ 
  4.  @Test 
  5.  public void test_Predicate2() { 
  6.  //① 將Predicate作為filter接口,Predicate起到一個判斷的作用 
  7.  Predicate<Integer> predicate = new Predicate<Integer>() { 
  8.  @Override 
  9.  public boolean test(Integer integer) { 
  10.  if(integer > 5){ 
  11.  return true
  12.  } 
  13.  return false
  14.  } 
  15.  }; 
  16.  Stream<Integer> stream = Stream.of(1233455666); 
  17.  List<Integer> list = stream.filter(predicate).collect(Collectors.toList()); 
  18.  list.forEach(System.out::println); 
  19.  System.out.println("********************"); 
  20.  } 

輸出結(jié)果

Java8之Consumer、Supplier、Predicate和Function攻略,建議收藏

這段代碼,首先創(chuàng)建一個 Predicate 對象,然后實現(xiàn) test 方法,在 test 方法中做一個判斷:如果傳入的參數(shù)大于 5 ,就返回 true,否則返回 false;

  1. Stream<Integer> stream = Stream.of(1233455666); 
  2.  List<Integer> list = stream.filter(predicate).collect(Collectors.toList()); 
  3.  list.forEach(System.out::println); 

這段代碼調(diào)用 Stream 的 filter 方法,filter 方法需要的參數(shù)就是 Predicate 接口,所以在這里只要大于 5 的數(shù)據(jù)就會輸出。

3.4 Predicate 接口總結(jié)

① Predicate 是一個謂詞型接口,其實只是起到一個判斷作用。 ② Predicate 通過實現(xiàn)一個 test 方法做判斷。

4 Function 接口

Function 接口是一個功能型接口,它的一個作用就是轉(zhuǎn)換作用,將輸入數(shù)據(jù)轉(zhuǎn)換成另一種形式的輸出數(shù)據(jù)。

4.1 Function 接口實例

  1. /** 
  2.  * Function測試,function的作用是轉(zhuǎn)換,將一個值轉(zhuǎn)為另外一個值 
  3.  */ 
  4.  @Test 
  5.  public void test_Function() { 
  6.  //① 使用map方法,泛型的第一個參數(shù)是轉(zhuǎn)換前的類型,第二個是轉(zhuǎn)化后的類型 
  7.  Function<String, Integer> function = new Function<String, Integer>() { 
  8.  @Override 
  9.  public Integer apply(String s) { 
  10.  return s.length();//獲取每個字符串的長度,并且返回 
  11.  } 
  12.  }; 
  13.  Stream<String> stream = Stream.of("aaa""bbbbb""ccccccv"); 
  14.  Stream<Integer> stream1 = stream.map(function); 
  15.  stream1.forEach(System.out::println); 
  16.  System.out.println("********************"); 
  17.  } 

輸出結(jié)果

Java8之Consumer、Supplier、Predicate和Function攻略,建議收藏

4.2 代碼分析

① Function 接口分析

  1. //① 使用map方法,泛型的第一個參數(shù)是轉(zhuǎn)換前的類型,第二個是轉(zhuǎn)化后的類型 
  2.  Function<String, Integer> function = new Function<String, Integer>() { 
  3.  @Override 
  4.  public Integer apply(String s) { 
  5.  return s.length();//獲取每個字符串的長度,并且返回 
  6.  } 
  7.  }; 

這段代碼創(chuàng)建了一個 Function 接口對象,實現(xiàn)了一個 apply 方法,這個方法有一個輸入?yún)?shù)和一個輸出參數(shù)。其中,泛型的第一個參數(shù)是轉(zhuǎn)換前的類型,第二個是轉(zhuǎn)化后的類型。

在上面的代碼中,就是獲取字符串的長度,然后將每個字符串的長度作為返回值返回。

② 重要應用 map 方法

  1. Stream<String> stream = Stream.of("aaa""bbbbb""ccccccv"); 
  2.  Stream<Integer> stream1 = stream.map(function); 
  3.  stream1.forEach(System.out::println); 

在 Function 接口的重要應用不得不說 Stream 類的 map 方法了,map 方法傳入一個 Function 接口,返回一個轉(zhuǎn)換后的 Stream類。

4.3 其他 Function 接口

除了上面使用的 Function 接口,還可以使用下面這些 Function 接口。 IntFunction 、DoubleFunction 、LongFunction 、ToIntFunction 、ToDoubleFunction 、DoubleToIntFunction 等等,使用方法和上面一樣。

4.4 Function 接口總結(jié)

① Function 接口是一個功能型接口,是一個轉(zhuǎn)換數(shù)據(jù)的作用。 ② Function 接口實現(xiàn) apply 方法來做轉(zhuǎn)換。

5 總結(jié)

通過前面的介紹,已經(jīng)對Consumer、Supplier、Predicate、Function這幾個接口有詳細的了解了,其實,這幾個接口并不是很難,只是有點抽象,多加理解會發(fā)現(xiàn)很簡單,并且特別好用!

責任編輯:張燕妮 來源: 今日頭條
相關(guān)推薦

2023-10-23 14:16:01

Java函數(shù)式編程

2021-08-03 07:51:43

Java 8 函數(shù)接口

2020-05-25 16:25:17

Java8Stream函數(shù)式接口

2025-04-02 04:55:00

2023-07-26 07:13:55

函數(shù)接口Java 8

2021-02-06 14:25:29

Java延遲加載代碼

2024-08-28 10:33:56

2012-07-18 09:45:32

Java 8ScalaLambda

2020-07-24 08:11:04

Java8ava5語言

2021-08-13 12:53:42

StringBuildStringJoineJava

2023-05-12 07:40:01

Java8API工具

2024-08-19 02:00:00

FunctionJava8接口

2017-10-31 20:45:07

JavaJava8Optional

2023-03-15 17:37:26

Java8ListMap

2014-12-22 10:14:31

Java8

2020-05-29 07:20:00

Java8異步編程源碼解讀

2021-12-30 22:50:32

KafkaConsumer 源碼

2023-12-21 08:02:21

CPUJava8列表

2011-03-02 14:07:24

Pureftpd

2011-03-21 10:49:33

LAMPApache
點贊
收藏

51CTO技術(shù)棧公眾號