java.util.function 用例

Predicate 断言

表示一个参数的断言(布尔值函数)这是一个功能接口,其功能方法是test(Object)。
更新时间:1.8
参数类型: 输入的参数类型

boolean test(T t)

   /**
     * 对给定的参数执行此断言.
     *
     * @param t 输入的参数
     * @return {@code true} 如果输入的参数和断言逻辑匹配则返回true,否则返回false,
     */
    boolean test(T t);

场景:将要举行一场武林大会,只有指定门派的弟子才能参加,为了防止有人冒充门派弟子,每个门派都有一套自己的校验方法来判断是不是门派弟子,现需要提供一个方法给大会工作人员,入参是各门派的校验方法和需要校验的人员,结果返回该人员所属门派。

  1. 先定义一个门派枚举 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;
    }
    
    }
    
  2. 定义鉴别武术招式工具类

    
    /**
     * 武术字典
     */
    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,"和尚");
        }
    
    }
    
  3. 定义一个收录所有门派和对应校验规则的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);
    	}
    
    
  4. 使用

    /**
     * @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

先就这样,其它要用上了再更新 ~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值