如果还不懂如何使用 Consumer 接口,来公司我当面给你讲!(二)

「这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战」。

上文中的问题大家思考的怎么样了?有没有小伙伴把自己的思路或者代码留在评论区呀?

说一下我的思路:如果我们想要将公共的部分抽取出来,发现都比较零散,还不如不抽取,但是不抽取代码又存在大量重复的代码不符合我的风格。于是我便将手伸向了 Consumer 接口。

更改之后的伪代码

B b = this.baseMapper.selectOne(queryWrapper);
if (b != null) {
	String status = b.getStatus();
	if (Objects.equals(Constants.STATUS_ING, status)){
		return "处理中";
	} else if (Objects.equals(Constants.STATUS_SUCCESS, status)){
		return "处理成功";
	}
	//失败的操作
	getResponse(dto, response, s -> mapper.updateById(s));
} else {
	getResponse(dto, response, s -> mapper.updateById(s));
}

public void getResponse(DTO dto, Response response, Consumer<B> consumer){
	//请求第三方接口并解析响应结果
	......
	if (ReturnInfoEnum.SUCCESS.getCode().equals(parse.getCode())) {
        ......
		bb.setStatus(Constants.STATUS_ING);
	
		consumer.accept(bb);

		//更新A表的状态
		a.setStatus(Constants.STATUS_ING);
		aMapper.updateById(a);
	}
}
复制代码

看到这,如果大家都已经看懂了,那么恭喜你,说明你对 Consumer 的使用已经全部掌握了。如果你还存在一丝丝的疑虑,那么就接着往下看,我们将介绍一下四种常见的函数式接口。

函数式接口

那什么是函数式接口呢?函数式接口是只有一个抽象方法(Object的方法除外),但是可以有多个非抽象方法的接口,它表达的是一种逻辑上的单一功能。

@FunctionalInterface

@FunctionalInterface 注解用来表示该接口是函数式接口。它有助于及早发现函数式接口中出现的或接口继承的不适当的方法声明。

如果接口用该注解来注释,但实际上不是函数式接口,则会在编译时报错。

Supplier

我们一般称之为“生产者”,没有参数输入,但是能返回结果,为结果的提供者。

@FunctionalInterface
public interface Supplier<T> {

    /**
     *  获取一个结果
     */
    T get();
}
复制代码

可以举个简单的例子感受下:

Optional<Double> optional = Optional.empty();
optional.orElseGet(()->Math.random() );

//orElseGet 方法的源码,里边用到了 get 方法
public T orElseGet(Supplier<? extends T> other) {   
    return value != null ? value : other.get();
}
复制代码

看了我的解决方案之后,有没有小伙伴和我是一样实现的?评论区举个爪爪吧,下文我们将继续讲解函数式接口的用法。如果你有不同的意见或者更好的idea,欢迎联系阿Q,添加阿Q可以加入技术交流群参与讨论呦!

おすすめ

転載: juejin.im/post/7035153717682765861