import com.caster.test.enums.CommonOnOffStatus;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.function.*;
public class FunctionInterfaceTest {
// 預設的 DemoBean 整數檢查 Predicate
static Predicate<DemoBean> checkDemoBeanInteger = (o -> o.getInteger() >= 10);
// 預設的 DemoBean 類型檢查 Predicate
static Predicate<DemoBean> checkDemoBeanType = (o -> StringUtils.equalsIgnoreCase(o.getType(), "C"));
// 預設的轉換 String 到 Integer 的 Function
Function<String, Integer> defaultFunction = Integer::parseInt;
// 預設的 DemoBean 整數印出 Consumer
static Consumer<DemoBean> defaultConsumerFun = (o -> System.out.println(o.getInteger()));
// 預設的 DemoBean 日期印出 Consumer
static Consumer<DemoBean> defaultConsumerFun_2 = (o -> System.out.println(o.getDate()));
// 預設的 DemoBean 類型印出 Consumer
static Consumer<DemoBean> defaultConsumerFun_3 = (o -> System.out.println(o.getType()));
// 預設的 DemoBean 供應者 Supplier
static Supplier<DemoBean> defaultSupplierFun = (() -> new DemoBean().setDate(new Date(System.currentTimeMillis() - 5896L))
.setType("B")
.setInteger(100)
.setBigDecimal(BigDecimal.valueOf(520L))
.setStatus(CommonOnOffStatus.OFF));
// 預設的 DemoBean 單元操作符 UnaryOperator
static UnaryOperator<DemoBean> defaultUnaryOperatorFun = (o -> o.setBigDecimal(BigDecimal.valueOf(777L)));
// 預設的 DemoBean 雙引數函數 BiFunction
static BiFunction<DemoBean, Boolean, String> defaultBiFunction = (DemoBean::printAddress);
// 預設的 DemoBean 轉換 Function
static Function<DemoBean, String> defaultFunction_1 = DemoBean::getType;
// 更新 DemoBean 資訊
static void updateInfo(DemoBean obj) {
System.out.println(String.format("toString:%s", obj));
}
public static void main(String[] args) throws ClassNotFoundException, InterruptedException {
DemoBean bean = new DemoBean().setDate(new Date(System.currentTimeMillis() - 60000L))
.setType("A")
.setInteger(158)
.setBigDecimal(BigDecimal.valueOf(177L))
.setStatus(CommonOnOffStatus.ON);
// 檢查整數和類型條件,返回結果
Boolean result = checkDemoBeanInteger.or(checkDemoBeanType).test(bean);
System.out.println(BooleanUtils.isTrue(result));
// 使用多個 Consumer 依序處理 DemoBean
defaultConsumerFun_3.andThen(defaultConsumerFun_2).andThen(defaultConsumerFun).accept(bean);
// 使用 Supplier 創建 DemoBean
DemoBean supplierBean = defaultSupplierFun.get();
System.out.println(String.format("toString:%s, obj address:%s", supplierBean, supplierBean.printAddress(true)));
// 使用 UnaryOperator 修改 DemoBean
DemoBean unaryOperatorBean = defaultUnaryOperatorFun.apply(supplierBean);
System.out.println(String.format("toString:%s, obj address:%s", unaryOperatorBean, unaryOperatorBean.printAddress(true)));
System.out.println("=========== separate =========");
// 使用 BiFunction 處理 DemoBean
System.out.println(String.format("toString:%s, obj address:%s", unaryOperatorBean, defaultBiFunction.apply(unaryOperatorBean, true)));
System.out.println(String.format("toString:%s, obj address:%s", unaryOperatorBean, defaultBiFunction.apply(unaryOperatorBean, false)));
List<DemoBean> list = List.of(bean, supplierBean, unaryOperatorBean);
// 遍歷並更新 DemoBean 資訊
list.forEach(FunctionInterfaceTest::updateInfo);
}
}