Java 8 Consumer示例

时间:2020-02-23 14:34:52  来源:igfitidea点击:

在本教程中,我们将看到Java 8消费者接口。

消费者是单个参数功能接口,如谓词,但它不会返回任何值。

由于消费者是功能接口,因此它可以用作Lambda表达式的分配目标。

消费者定义

Consumer采用单一论点,不会返回任何结果。
这是定义 Consumer接口。

@FunctionalInterface
public interface Consumer<T> {
 
    /**
     * Performs this operation on the given argument.
     *
     * @param t the input argument
     */
    void accept(T t);
 
    default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
}

它具有一个功能性方法 accept()和默认方法

andThen()

消费者的例子

accept()方法示例

让我们使用Consumer接口来打印字符串:

package org.igi.theitroad;
package org.igi.theitroad;
import java.util.function.Consumer;
 
public class Java8ConsumerExample {
 
 public static void main(String[] args) {
  
  Consumer<String> consumerString=s->System.out.println(s);
  consumerString.accept("igi");
 }
}

我们创造了 consumer目标所需的对象 String对象作为输入和打印它。
它很简单地使用消费者接口来打印字符串。

默认 andThen()方法示例

根据java文档:返回a composed Consumer按顺序执行此操作后跟后续操作。
如果执行任一操作抛出 exception,它被转发到组成操作的呼叫者。
如果执行此操作抛出异常,则不会执行后操作之后。

package org.igi.theitroad;
import java.util.function.Consumer;
 
public class Java8ConsumerExample {
 
 public static void main(String[] args) {
  
	 Consumer<String> firstC = x -> System.out.println(x.toLowerCase());
	 Consumer<String> secondC = y -> System.out.println(y.toUpperCase());
 
	 Consumer<String> result = firstC.andThen(secondC);
  
    result.accept("igi");
 }
}

正如我们所看到的,我们创建了两个消费者并使用过 andThen()创建复合消费者的方法。
当我们调用的时候 accept()复合消费者的方法,依次调用消费者。

消费者的Foreach示例

让我们说你有 Student程序如下:

package org.igi.theitroad;
 
public class Student {
 
	private int id;
	private String name;
	private String gender;
	private int age;
 
	public Student(int id, String name, String gender, int age) {
		super();
		this.id = id;
		this.name = name;
		this.gender = gender;
		this.age = age;
	}
 
	public int getId() {
		return id;
	}
 
	public void setId(int id) {
		this.id = id;
	}
 
	public String getName() {
		return name;
	}
 
	public void setName(String name) {
		this.name = name;
	}
 
	public String getGender() {
		return gender;
	}
 
	public void setGender(String gender) {
		this.gender = gender;
	}
 
	public int getAge() {
		return age;
	}
 
	public void setAge(int age) {
		this.age = age;
	}
 
	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", gender=" + gender + ", age=" + age + "]";
	}
}

现在让我们在主类中创建消费者对象并将其传递给列表的forEach方法:

package org.igi.theitroad;
 
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
 
public class Java8ConsumerStudentExample {
 
	public static void main(String[] args) {
 
		List<Student> studentList = createStudentList();
		//Creating Consumer for student object which will be used in forEach method of
		//list
		Consumer<Student> consumerForStudent = s -> System.out.println(s);
		studentList.forEach(consumerForStudent);
	}
 
	public static List<Student> createStudentList() {
		List<Student> studentList = new ArrayList<>();
		Student s1 = new Student(1, "igi", "M", 19);
		Student s2 = new Student(2, "John", "M", 17);
		Student s3 = new Student(3, "Mary", "F", 14);
		Student s4 = new Student(4, "Martin", "M", 21);
		Student s5 = new Student(5, "Monica", "F", 16);
		Student s6 = new Student(6, "Ally", "F", 20);
 
		studentList.add(s1);
		studentList.add(s2);
		studentList.add(s3);
		studentList.add(s4);
		studentList.add(s5);
		studentList.add(s6);
		return studentList;
	}
}

我们创建了所需的消费者对象 student对象作为输入和打印。
上面创建的Confueer对象然后传递给 foreach()可迭代接口的方法。

default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

正如我们所看到的,foreach()方法需要 consumer作为输入和呼叫 accept()在迭代的每个对象上的方法。