Predicate 断言
表示一个参数的断言(布尔值函数)这是一个功能接口,其功能方法是test(Object)。
更新时间:1.8
参数类型: 输入的参数类型
boolean test(T t)
/**
* 对给定的参数执行此断言.
*
* @param t 输入的参数
* @return {@code true} 如果输入的参数和断言逻辑匹配则返回true,否则返回false,
*/
boolean test(T t);
场景:将要举行一场武林大会,只有指定门派的弟子才能参加,为了防止有人冒充门派弟子,每个门派都有一套自己的校验方法来判断是不是门派弟子,现需要提供一个方法给大会工作人员,入参是各门派的校验方法和需要校验的人员,结果返回该人员所属门派。
-
先定义一个门派枚举 SectEnum
public enum SectEnum { /** * 散人 */ UNDEFINED(0, "散人"), /** * 武当派 */ WU_DANG(1,"武当派"), /** * 峨眉派 */ E_MEI(11,"峨眉派"), /** * 少林寺 */ SHAO_LING(2,"少林寺"), /** * 青城派 */ QING_CHENG(31,"青城派"), /** * 昆仑派 */ KUN_LUN(32,"昆仑派"), /** * 华山派 */ HUA_SHAN(34,"华山派"); /** * 类型编号 */ private final Integer value; /** * 类型名称 */ private final String name; SectEnum(Integer value, String name) { this.value = value; this.name = name; } /** * 获取枚举对应的类型编号 * @return 类型编号 */ public Integer getValue() { return value; } /** * 获取枚举对应的类型名称 * @return 类型名称 */ public String getName() { return name; } }
-
定义鉴别武术招式工具类
/** * 武术字典 */ private static class WSDictionaryUtil { private WSDictionaryUtil() { } /** * 判断是武当派 */ private static boolean isWuDang(User user) { // 身份是道士,会耍太极剑法 return Objects.equals(user.wushu,"太极剑") && Objects.equals(user.identity,"道士"); } /** * 判断是峨嵋派。 */ private static boolean isEMmei(User user) { // 性别是女性而且身份是尼姑,会耍峨眉剑法 return Objects.equals(user.wushu,"峨眉剑") && Objects.equals(user.sex,"女性") && Objects.equals(user.identity,"尼姑"); } /** * 判断是少林派。 */ private static boolean isShaoLing(User user) { // 身份是和尚,会铁头功 return Objects.equals(user.wushu,"铁头功") && Objects.equals(user.identity,"和尚"); } }
-
定义一个收录所有门派和对应校验规则的Map
private static final Map<SectEnum,Predicate<User>> wushuBaodianMap = new EnumMap<>(SectEnum.class); static { wushuBaodianMap.put(SectEnum.WU_DANG, WSDictionaryUtil::isWuDang); wushuBaodianMap.put(SectEnum.E_MEI, WSDictionaryUtil::isEMmei); wushuBaodianMap.put(SectEnum.SHAO_LING, WSDictionaryUtil::isShaoLing); }
-
使用
/** * @param user 需要判断的人 * @param wushuBaodianMap 门派校验规则 * @return 所属门派 */ private static SectEnum getSectEnum(User user, Map<SectEnum, Predicate<User>> wushuBaodianMap) { //遍历校验规则,将用户放到每一个校验规则中进行校验 for (Entry<SectEnum, Predicate<User>> e : wushuBaodianMap.entrySet()) { Predicate<User> p = e.getValue(); //当校验结果是 true 时返回校验规则对应的门派名称 if (p.test(user)) { return e.getKey(); } } // 当都不匹配时,返回默认值,散人 return SectEnum.UNDEFINED; }
Function<T, R> 作用
表示接受一个参数并生成结果的函数。这是一个函数接口,其函数方法为application(Object)。
更新时间:1.8
参数类型:<T>–函数输入的类型 <R>–函数结果的类型
Function<T, T> identity()
/**
* 这是一个将入参原封不动返回的函数.
*
* @param<T> 函数的输入和输出对象的类型
* @return 始终返回其输入参数
*/
static <T> Function<T, T> identity() {
return t -> t;
}
用法:在用流的方式处理集合,将集合转Map时
场景:用户信息中可能包含订单信息,现在需要将用户信息中的订单信息提出来,以下单时间来区分
Map<String, Order> userMap = userList.stream().filter(user->this.validate(user))
.map(User::getOrder).collect(Collectors.toMap(Order::getCreateTime, Function.identity(), (k1, k2)->k1));
//拆解:
// .filter(user->this.validate(user)):过滤掉用户集合中不包含订单信息的用户
// .map(User::getOrder) 遍历过滤后的用户集合 获取用户的订单
// .collect(Collectors.toXXX 将 map 返回的用户订单信息收集起来,
// .toMap:以Map的格式收集,还有toList toSet
// Order::getCreateTime, Function.identity(), 定义 下单时间为 Map 的 key,订单本身作为 value
//(k1, k2)->k1) 出现重复Key时,保留第一个value
先就这样,其它要用上了再更新 ~