Java8 Consumer、Supplier、Predicate、Function

[复制链接]
发表于 2024-6-23 20:40:48 来自手机 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本日我们还讲讲Consumer、Supplier、Predicate、Function这几个接口的用法,在 Java8 的用法当中,这几个接口固然没有明目张胆的使用,但是,却是润物细无声的。为什么这么说呢?这几个接口都在 java.util.function 包下的,分别是Consumer(消耗型)、supplier(供给型)、predicate(谓词型)、function(功能性),信赖有了后面的解释,你应该非常清楚这个接口的功能了。那么,下面,我们从具体的应用场景来讲讲这个接口的用法!
vConsumer

Java Consumer接口来自Java 8中引入的 java.util.function包。
Consumer是一个功能接口,用来作为lambda表达式或方法引用的任务目的(传递一个参数执行指定的方法)。
Consumer的功能接口是一个接受单一参数而且不返回任何结果的操纵。
Consumer的功能方法是accept(T t)。
Consumer具有以下方法。
1. accept : 这是Consumer功能接口的功能方法。accept 方法对给定的参数进行这一操纵。
2. andThen : 此方法返回一个组合的Consumer,该Consumer先执行原始的Consumer操纵,然后按照从左到右的顺序执行给定的andThen操纵。
功能方法:accept
功能方法accept在功能接口Consumer中的定义
  1. void accept(T t)
复制代码
使用示例
ConsumerAccept.java
  1. import java.util.function.Consumer;
  2. public class ConsumerAccept {
  3.   public static void main(String[] args) {
  4.     Consumer<String> nameConsumer = s -> System.out.println(s);
  5.    
  6.     nameConsumer.accept("Mahesh");
  7.     nameConsumer.accept("Krishna");
  8.   }
  9. }
复制代码
输出
  1. Mahesh
  2. Krishna
复制代码
使用Lambda表达式创建Consumer
可以使用lambda表达式创建Consumer。
例1 基础范例操纵
在我们的示例中,我们将使用lambda表达式在此处创建两个Consumer。
一个用于将数字添加到列表的方法,如果数字为奇数,则将添加到具有奇数的列表中;如果数字为偶数,则将其添加到具有偶数的另一个列表中。
ConsumerLambda1.java
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.function.Consumer;
  4. public class ConsumerLambda1 {
  5.   public static void main(String[] args) {
  6.     List<Integer> oddList = new ArrayList<>();
  7.     List<Integer> evenList = new ArrayList<>();
  8.    
  9.     Consumer<Integer> storeNumber = n -> {
  10.        if (n % 2 == 0) {
  11.          evenList.add(n);
  12.        } else {
  13.          oddList.add(n);
  14.        }
  15.     };
  16.    
  17.     Consumer<List<Integer>> printList = list -> list.forEach(n -> System.out.println(n));
  18.    
  19.     storeNumber.accept(10);
  20.     storeNumber.accept(15);
  21.     storeNumber.accept(25);
  22.     storeNumber.accept(30);
  23.    
  24.     System.out.println("--- Odd number ---");
  25.    
  26.     printList.accept(oddList);
  27.    
  28.     System.out.println("--- Even number ---");
  29.    
  30.     printList.accept(evenList);
  31.   }
  32. }
复制代码
输出结果
  1. --- Odd number ---
  2. 15
  3. 25
  4. --- Even number ---
  5. 10
  6. 30
复制代码
例2 对象范例操纵
我们将使用lambda表达式创建一个Consumer,它将决定并显示一个公民在推举中是否可以投票的数据。
ConsumerLambda2.java
  1. import java.util.function.Consumer;
  2. public class ConsumerLambda2 {
  3.   public static void main(String[] args) {
  4.      Consumer<Citizen> electionConsumer = c -> {
  5.        if (c.getAge() < 18) {
  6.          System.out.println(c.getName() + " is not eligible to vote.");
  7.        } else {
  8.          System.out.println(c.getName() + " can vote.");
  9.        }
  10.      };
  11.      
  12.      electionConsumer.accept(new Citizen("Ritesh", 15));
  13.      
  14.      electionConsumer.accept(new Citizen("Shreya", 20));
  15.   }
  16. }
  17. class Citizen {
  18.   private String name;
  19.   private int age;
  20.   public Citizen(String name, int age) {
  21.     this.name = name;
  22.     this.age = age;
  23.   }
  24.   public String getName() {
  25.     return name;
  26.   }
  27.   public int getAge() {
  28.     return age;
  29.   }
  30. }
复制代码
输出结果
  1. Ritesh is not eligible to vote.
  2. Shreya can vote.
复制代码
使用方法引用创建Consumer
Consumer可以使用方法引用来创建。
在我们的例子中,我们有一个有两个方法的实用类Utility,其中一个方法将替换Map中的值,第二个方法显示Map中的数据。我们将使用方法引用来创建Consumer。
ConsumerMethodRef.java
  1. import java.util.HashMap;
  2. import java.util.Map;
  3. import java.util.function.Consumer;
  4. public class ConsumerMethodRef {
  5.   public static void main(String[] args) {
  6.     Map<Integer, String> persons = new HashMap<Integer, String>();
  7.     persons.put(101, "Mahesh");
  8.     persons.put(102, "Krishna");
  9.     Consumer<Map<Integer, String>> updatePersons = Utility::updateData;
  10.     Consumer<Map<Integer, String>> displayPersons = Utility::displayData;
  11.     updatePersons.accept(persons);
  12.     displayPersons.accept(persons);
  13.   }
  14. }
  15. class Utility {
  16.   static void updateData(Map<Integer, String> persons) {
  17.     persons.replaceAll((k, v) -> "Shree ".concat(v));
  18.   }
  19.   static void displayData(Map<Integer, String> persons) {
  20.     for (Map.Entry<Integer, String> entry : persons.entrySet()) {
  21.       System.out.println(entry.getKey() + " - " + entry.getValue());
  22.     }
  23.   }
  24. }
复制代码
输出结果
  1. 101 - Shree Mahesh
  2. 102 - Shree Krishna
复制代码
使用andThen方法
在Java文档中andThen方法声明。
[code]default Consumer andThen(Consumer
继续阅读请点击广告
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表