Java Consumer函数式接口介绍及使用示例

x33g5p2x  于2022-09-24 转载在 Java  
字(5.2k)|赞(0)|评价(0)|浏览(403)

Java Consumer 接口来自 Java 8 中引入的 java.util.function 包。Consumer 是一个函数式接口,用作 lambda 表达式或方法引用的赋值目标。 Consumer 函数式接口是一个接受单个参数并且不返回任何内容的操作。 Consumer的函数方法是accept(T t)
Consumer 有以下方法。
1。 accept :这是 Consumer 函数接口的函数方法。 accept 方法对给定的参数执行此操作。
2。 andThen :此方法返回一个组合的 Consumer,它执行此操作,然后执行给定的操作。

函数方法:accept

找到Consumer函数接口的函数方法。

void accept(T t)

找到使用此方法的代码。
ConsumerAccept.java

import java.util.function.Consumer;

public class ConsumerAccept {
  public static void main(String[] args) {
    Consumer<String> nameConsumer = s -> System.out.println(s); 
    
    nameConsumer.accept("Mahesh");
    nameConsumer.accept("Krishna");
  }
}

输出

Mahesh
Krishna

使用 Lambda 表达式创建Consumer

Java Consumer 可以使用 lambda 表达式创建。查找示例。
Example-1:我们将在示例中使用 lambda 表达式创建两个 Consumer
一个用于将数字添加到列表中,如果数字是奇数,那么我们将添加到具有奇数的列表中,如果数字是偶数,那么我们会将其添加到具有偶数的另一个列表中。
我们将创建另一个显示列表数据的 Consumer
ConsumerLambda1.java

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

public class ConsumerLambda1 {
  public static void main(String[] args) {
	List<Integer> oddList = new ArrayList<>();
	List<Integer> evenList = new ArrayList<>();
	
	Consumer<Integer> storeNumber = n -> {
	   if (n % 2 == 0) {
		 evenList.add(n);
	   } else {
		 oddList.add(n);
	   }
	};
	
	Consumer<List<Integer>> printList = list -> list.forEach(n -> System.out.println(n));
	
	storeNumber.accept(10);
	storeNumber.accept(15);
	storeNumber.accept(25);
	storeNumber.accept(30);
	
	System.out.println("--- Odd number ---");
	
	printList.accept(oddList);
	
	System.out.println("--- Even number ---");
	
	printList.accept(evenList);
  }
}

输出

--- Odd number ---
15
25
--- Even number ---
10
30

示例 2:我们将使用 lambda 表达式创建一个 Consumer,该表达式将为公民决定并显示该人是否可以在选举中投票的数据。
ConsumerLambda2.java

import java.util.function.Consumer;

public class ConsumerLambda2 {
  public static void main(String[] args) {
     Consumer<Citizen> electionConsumer = c -> {
       if (c.getAge() < 18) {
    	 System.out.println(c.getName() + " is not eligible to vote.");
       } else {
    	 System.out.println(c.getName() + " can vote.");
       }
     };
     
     electionConsumer.accept(new Citizen("Ritesh", 15));
     
     electionConsumer.accept(new Citizen("Shreya", 20));
  }
}

class Citizen {
  private String name;
  private int age;

  public Citizen(String name, int age) {
	this.name = name;
	this.age = age;
  }

  public String getName() {
	return name;
  }

  public int getAge() {
	return age;
  }
}

输出

Ritesh is not eligible to vote.
Shreya can vote.

使用方法引用创建Consumer

Java Consumer 可以使用方法引用来创建。
在我们的示例中,我们有一个具有两个方法的实用程序类,其中一个方法将替换地图中的值,第二个方法显示地图数据。我们将使用方法参考创建 Consumer。找到例子。
ConsumerMethodRef.java

import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;

public class ConsumerMethodRef {
  public static void main(String[] args) {
	Map<Integer, String> persons = new HashMap<Integer, String>();
	persons.put(101, "Mahesh");
	persons.put(102, "Krishna");

	Consumer<Map<Integer, String>> updatePersons = Utility::updateData;

	Consumer<Map<Integer, String>> displayPersons = Utility::displayData;

	updatePersons.accept(persons);

	displayPersons.accept(persons);
  }
}

class Utility {
  static void updateData(Map<Integer, String> persons) {
	persons.replaceAll((k, v) -> "Shree ".concat(v));
  }

  static void displayData(Map<Integer, String> persons) {
	for (Map.Entry<Integer, String> entry : persons.entrySet()) {
	  System.out.println(entry.getKey() + " - " + entry.getValue());
	}
  }
}

输出

101 - Shree Mahesh
102 - Shree Krishna

函数方法:andThen

从 Java 文档中找到 andThen 方法声明。

default Consumer<T> andThen(Consumer<? super T> after)
  1. 此方法返回执行此操作的组合 Consumer,然后执行 after 操作。
  2. 如果此操作或 after 操作出现异常,则将其转发到组合操作。
  3. 如果该操作抛出异常,则不会执行 after 操作。
    示例 1
    我们的示例中有两个 Consumer。首先 squareConsumer 将执行,然后 printConsumer 将执行。
    ConsumerAndThen1.java
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

public class ConsumerAndThen1 {
  public static void main(String[] args) {
	List<Integer> numList = Arrays.asList(3, 4, 5, 6);

	Consumer<List<Integer>> squareConsumer = list -> {
	  for (int i = 0; i < list.size(); i++) {
		list.set(i, list.get(i) * list.get(i));
	  }
	};

	Consumer<List<Integer>> printConsumer = list -> list.forEach(n -> System.out.println(n));

	squareConsumer.andThen(printConsumer).accept(numList);
  }
}

输出

9
16
25
36

Example-2:查找 andThen 方法的另一个示例。这里我们多次使用 andThen。首先 oddNumConsumer 将执行,然后 evenNumConsumer 将执行,然后 taskFinishConsumer 将执行。
ConsumerAndThen2.java

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

public class ConsumerAndThen2 {
  public static void main(String[] args) {
	List<Integer> list = Arrays.asList(12, 13, 14, 15, 16, 17);

	Consumer<List<Integer>> oddNumConsumer = MyNumber::printOddNum;

	Consumer<List<Integer>> evenNumConsumer = MyNumber::printEvenNum;

	Consumer<List<Integer>> taskFinishConsumer = MyNumber::taskFinishMsg;

	oddNumConsumer.andThen(evenNumConsumer).andThen(taskFinishConsumer).accept(list);
  }
}

class MyNumber {
  static void printOddNum(List<Integer> myNumbers) {
	System.out.println("--- odd numbers ---");
	myNumbers.forEach(n -> {
	  if (n % 2 == 1) {
		System.out.print(n + " ");
	  }
	});
  }

  static void printEvenNum(List<Integer> myNumbers) {
	System.out.println("\n--- even numbers ---");
	myNumbers.forEach(n -> {
	  if (n % 2 == 0) {
		System.out.print(n + " ");
	  }
	});
  }

  static void taskFinishMsg(List<Integer> myNumbers) {
	System.out.println("\nTotal " + myNumbers.size() + " number processed.");
  }
}

输出

--- odd numbers ---
13 15 17 
--- even numbers ---
12 14 16 
Total 6 number processed.

相关文章

微信公众号

最新文章

更多