Java8-Consumer的使用场景

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);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值