最无用的工具类封装——Equals条件封装 2
昨天出了一篇最无用的工具类封装 EqualsUtils
出这个工具类的目的是为了解决书写 if 语句比较多的时候造成的错误,结果搞出个什么鬼
今天我针对昨天的 EqualsUtils 做了扩展,并使用了一个新名字——IfUtils
社会我 T 哥,人狠话不多,上代码
package cn.texous.test.demo.commons.utils;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Supplier;
import static cn.texous.test.demo.commons.utils.IfUtils.Condition.equalsCondition;
import static cn.texous.test.demo.commons.utils.IfUtils.Condition.newCondition;
import static cn.texous.test.demo.commons.utils.IfUtils.Condition.notEqualsCondition;
/**
* if 条件构造工具类
*
* @author Showa.L
* @since 2020/7/16 9:58
*/
public class IfUtils {
/**
* 判断连个对象是否 equals
*
* @param source 原对象
* @param target 目标对象
* @return
*/
public static boolean equals(Object source, Object target) {
if (source == target)
return true;
return Optional.ofNullable(source).map(s -> s.equals(target)).orElse(false);
}
/**
* 判断连个对象是否 equals
*
* @param sourceSupplier 原对象提供者
* @param targetSupplier 目标对象提供者
* @return
*/
public static boolean equals(Supplier<Object> sourceSupplier, Supplier<Object> targetSupplier) {
return equals(sourceSupplier.get(), targetSupplier.get());
}
/**
* 判断连个对象是否 notEquals
*
* @param source 原对象
* @param target 目标对象
* @return
*/
public static boolean notEquals(Object source, Object target) {
return !equals(source, target);
}
/**
* 判断连个对象是否 notEquals
*
* @param sourceSupplier 原对象提供者
* @param targetSupplier 目标对象提供者
* @return
*/
public static boolean notEquals(Supplier<Object> sourceSupplier, Supplier<Object> targetSupplier) {
return notEquals(sourceSupplier.get(), targetSupplier.get());
}
/**
* 判断对象是否为 true
*
* @param source 类型
* @return
*/
public static boolean isTrue(Boolean source) {
return Optional.ofNullable(source).orElse(false);
}
/**
* 判断对象是否为 false
*
* @param source 类型
* @return
*/
public static boolean isFalse(Boolean source) {
return !isTrue(source);
}
/**
* 构建对象关系
*
* @param condition 对象条件 {@link Condition}
* @return
*/
public static Relation build(Supplier<Boolean> condition) {
return Relation.build(condition);
}
/**
* 校验判断
*
* @param relation 条件语句
* @return
*/
public static Boolean validate(Relation relation) {
return relation.validate();
}
/**
* 校验成功后处理
*
* @param relation 校验条件
* @param doSomething 处理方法
*/
public static void validateThen(Relation relation, Consumer<Boolean> doSomething) {
Optional.ofNullable(relation).map(Relation::validate).filter(IfUtils::isTrue).ifPresent(doSomething);
}
/**
* 需要进行对比的对象,及对比条件
*
* @param <S> 对象1
* @param <T> 对象2
*/
@Data
public static class Condition<S, T> implements Supplier<Boolean> {
private S source;
private T target;
private List<CompareInfo<S, T>> compares = new ArrayList<>();
private Condition(S source, T target, BiFunction<S, T, Boolean> compare) {
this.source = source;
this