如果还不懂如何使用 Consumer 接口,来我当面给你讲!
Python涨薪研究所
共 2778字,需浏览 6分钟
·
2021-12-02 11:01
源 / 文/ 阿Q
背景
A表中的状态为处理中:直接返回处理中字样; A表中的状态为处理成功:直接返回成功的字样; A表中的状态为处理失败:此时需要调用第三方接口,更新B表同时更新A表的状态;
代码实现
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 "处理成功";
}
//失败的操作
//请求第三方接口并解析响应结果
......
if (ReturnInfoEnum.SUCCESS.getCode().equals(parse.getCode())) {
......
//更新B表操作
bb.setStatus(Constants.STATUS_ING);
mapper.updateById(bb);
//更新A表的状态
a.setStatus(Constants.STATUS_ING);
aMapper.updateById(a);
}
} else {
//请求第三方接口并解析响应结果
......
if (ReturnInfoEnum.SUCCESS.getCode().equals(parse.getCode())) {
......
//插入B表操作
bb.setStatus(Constants.STATUS_ING);
mapper.insert(bb);
//更新A表的状态
a.setStatus(Constants.STATUS_ING);
aMapper.updateById(a);
}
}
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 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);
}
}
函数式接口
@FunctionalInterface
@FunctionalInterface
注解用来表示该接口是函数式接口。它有助于及早发现函数式接口中出现的或接口继承的不适当的方法声明。Consumer
@FunctionalInterface
public interface Consumer<T> {
/**
* 对给定的参数执行此操作。
*/
void accept(T t);
/**
*
* 返回一个组合的 Consumer ,依次执行此操作,然后执行after操作。
* 如果执行任一操作会抛出异常,它将被转发到组合操作的调用者。
* 如果执行此操作会引发异常,则不会执行after操作。
*/
default ConsumerandThen(Consumer super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
getResponse()
中,然后在该方法中执行 accept()
方法进行消费即可。如果还不理解,我们可以把它转换为匿名内部类的调用方式。getResponse(dto, response, new Consumer() {
@Override
public void accept(B bb) {
mapper.insert(bb);
}
});
accept()
方法的时候就会去调用匿名内部类的方法了,也就是我们传入 getResponse()
的逻辑方法。Supplier
@FunctionalInterface
public interface Supplier<T> {
/**
* 获取一个结果
*/
T get();
}
Optional optional = Optional.empty();
optional.orElseGet(()->Math.random() );
//orElseGet 方法的源码,里边用到了 get 方法
public T orElseGet(Supplier extends T> other) {
return value != null ? value : other.get();
}
Function
@FunctionalInterface
public interface Function<T, R> {
/**
* 将 T 类型的参数传入,经过函数表达式的计算,返回 R 类型的结果
*/
R apply(T t);
/**
* 返回一个组合函数,先将参数应用于 before 函数,然后将结果应用于当前函数,返回最终结果。
* 如果对任一函数的求值引发异常,则会将其转发给组合函数的调用方。
*/
defaultFunction compose(Function super V, ? extends T> before) {
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
}
/**
* 返回一个组合函数,先将参数应用与当前函数,然后将结果应用于 after 函数,返回最终的结果。
* 如果对任一函数的求值引发异常,则会将其转发给组合函数的调用方。
*/
defaultFunction andThen(Function super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
/**
* 返回始终返回其输入参数的函数。
*/
staticFunction identity() {
return t -> t;
}
}
@Data
@AllArgsConstructor
public class Teacher {
private String name;
private int age;
}
public class TeacherTest {
public static void main(String[] args) {
Listlist = Arrays.asList(
new Teacher("张三",25),
new Teacher("李四",28),
new Teacher("王五",18));
Listcollect = list.stream().map(item -> item.getName()).collect(Collectors.toList());
System.out.println(collect);
}
}
item.getName()
为返回处理的结果,最后输出结果为[张三, 李四, 王五]
Predicate
@FunctionalInterface
public interface Predicate<T> {
/**
* 接收一个参数, 判断这个参数是否匹配某种规则, 匹配成功返回true, 匹配失败则返回false
*/
boolean test(T t);
/**
* 接收一个 Predicate 类型的参数,用当前函数和 other 函数逻辑与判断参数 t 是否匹配规则,成功返回true,失败返回 false
* 如果当前函数返回 false,则 other 函数不进行计算
* 在评估 Predicate 期间引发的任何异常都会转发给调用方
*/
default Predicateand(Predicate super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
/**
* 返回当前Predicate取反操作之后的Predicate
*/
default Predicatenegate() {
return (t) -> !test(t);
}
/**
* 接收一个 Predicate 类型的参数,用当前函数和 other 函数 逻辑或 判断参数 t 是否匹配规则,成功返回true,失败返回 false
* 如果当前函数返回 true,则 other 函数不进行计算
* 在评估 Predicate 期间引发的任何异常都会转发给调用方
*/
default Predicateor(Predicate super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
/**
* 静态方法:传入一个参数,用来生成一个 Predicate,调用test() 方法时调的 object -> targetRef.equals(object) 函数式
*
*/
staticPredicate isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
}
public static void main(String[] args) {
Listlist = Arrays.asList(
new Teacher("张三",25),
new Teacher("李四",28),
new Teacher("王五",18));
list = list.stream().filter(item -> item.getAge()>25).collect(Collectors.toList());
list.stream().forEach(item->System.out.println(item.getName()));
}
filter()
的参数为 Predicate
类型的,返回结果为:李四Consumer
和 Supplier
。当时只是脑子里学会了,没有应用到具体的项目中,下次再遇到的时候还是一脸懵逼,不知道大家有没有这种感受。
END
顶级程序员:topcoding
做最好的程序员社区:Java后端开发、Python、大数据、AI
一键三连「分享」、「点赞」和「在看」
评论