Java8的Consumer比较抽象。结合几个例子来看看常用的使用场景有以下几个:
把方法作为函数的入参
Java8中可以使用Consumer来实现在函数的入参中传递方法,这个如果熟悉js的话可能会比较好理解一些。在某些情况下,不能直接使用某个对象的方法,需要把方法传递到另一个函数里面去执行,那么可以通过入参的形式传递过去,在另一个地方使用对象的方法。
下面通过例子来展示一下具体的使用:
首先定义个实体类Person
public class Person {
private Integer age;
private String name;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
然后在PersonTest 中定义实体类Person的执行动作:
public class PersonTest {
protected Consumer<Person> consumer;
public PersonTest(Consumer<Person> consumer) {
this.consumer = consumer;
}
public void run() {
Person person = new Person();
person.setAge(30);
person.setName("haha");
consumer.accept(person);
}
}
在ConsumerTest 类中定义了readPerson方法来执行Person的动作。readPerson方法作为参数在PersonTest的run()方法里执行了。
public class ConsumerTest {
public static void main(String[] args) {
ConsumerTest test = new ConsumerTest();
new PersonTest(test::readPerson).run();
}
private void readPerson(Person person) {
System.out.println(person.getAge());
System.out.println(person.getName());
}
}
作为回调函数
可以很方便的实现回调函数了。
public class ConsumerTest1 {
private static final Map<String, Integer> map = new HashMap<String, Integer>() {
{
put("Tom", 10);
put("Jerry", 3);
}
};
public static void main(String[] args) {
//调用方法,同时编写对结果的回调:此处仅仅打印而已
test("Tom", ConsumerTest1::printName);
}
public static void test(String name, Consumer<Integer> consumer) {
System.out.println("name is " + name);
consumer.accept(map.get(name));
}
public static void printName(Integer age) {
//业务处理
System.out.println("age is " + age);
}
}
默认方法andThen
andThen 如果一个方法的参数和返回值全都是 Consumer 类型,那么就可以实现效果:消费数据的时候,首先做一个操作, 然后再做一个操作。
public class ConsumerTest2 {
public static void main(String[] args) {
Consumer<String> first = (x) -> toLower(x);
Consumer<String> next = (x) -> toUpper(x);
first.andThen(next).accept("Hello World");
}
private static String toLower(String x) {
return x.toLowerCase();
}
private static String toUpper(String x) {
return x.toUpperCase();
}
}
forEach方法
在我们经常使用的forEach方法中底层实现也是Consumer
public class ConsumerTest {
public static void main(String[] args) {
List<String> names = new ArrayList<String>() {
{
add("Tom");
add("Jerry");
}
};
names.forEach(e -> System.out.println(e));
names.forEach(System.out::println);
}
}
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
标签:场景,String,void,public,static,Consumer,Java8,name
From: https://www.cnblogs.com/ByteSpaceX/p/17479997.html