美文网首页工作生活
jdk8 新特性 Optional

jdk8 新特性 Optional

作者: dwwl | 来源:发表于2019-07-09 14:44 被阅读0次

    ​ JDK8新特性 :Optional(看似高大上 实则没卵用的东西)

    github : https://github.com/abksrv/optional-chaining-comparison-if-else.git

    ​ Validator.java

    package com.mpt.propertiesDemo.java8;
    
    import java.util.Optional;
    
    @FunctionalInterface
    interface Validator {
        /**
         * Validate input String
         * 
         * @return An Optional containing error message or an empty Optional when
         *         validation is successful.
         */
        Optional<ValidationFailedObject> validate(String input);
    }
    

    ValidationFailedObject.java

    package com.mpt.propertiesDemo.java8;
    
    /**
     * Details of a failed validation.
     * 
     * @author AbK
     *
     */
    public class ValidationFailedObject {
        public ValidationFailedObject(String string) {
            this.message = string;
        }
    
        private String message;
    }
    
    package com.mpt.propertiesDemo.java8;
    
    import java.util.Optional;
    
    public class ChainedValidator implements Validator{
    
        private static final int MINIMUM_LENGTH = 8;
    
        public Optional<ValidationFailedObject> validate(final String userInput) {
            return validateUsing(minimumLengthValidator(), userInput).map(Optional::of)
                    .orElseGet(() -> validateUsing(numericCharactersValidator(),
                                    userInput)).map(Optional::of)
                    .orElseGet(() -> validateUsing(upperCaseCharactersValidator(),
                                    userInput));
            /*return validateUsing(minimumLengthValidator(), userInput)
                    .or(() -> validateUsing(numericCharactersValidator(), userInput))
                    .or(() -> validateUsing(upperCaseCharactersValidator(), userInput));*/
        }
    
        private Validator numericCharactersValidator() {
            return input -> input.matches(".*\\d+.*") ? Optional.empty() : Optional
                    .of(new ValidationFailedObject("Should contain at least a digit"));
        }
    
        private Validator upperCaseCharactersValidator() {
            return input -> input.matches(".*[A-Z]+.*") ? Optional.empty()
                    : Optional.of(new ValidationFailedObject("Should contain an upper case letter"));
        }
    
        private Validator minimumLengthValidator() {
            return input -> (input != null && input.length() > MINIMUM_LENGTH) ? Optional
                    .empty() : Optional.of(new ValidationFailedObject(
                    "Required min. length at least " + MINIMUM_LENGTH + " characters."));
        }
    
        private Optional<ValidationFailedObject> validateUsing(Validator validator,
                String userInput) {
            return validator.validate(userInput);
        }
        
        public static void main(String[] args) {
            Optional<ValidationFailedObject> validate = new ChainedValidator().validate("123ZemenskyabC");
            validate.ifPresent(obj -> System.out.println(obj));
        }
    }
    
    

    虽然从语法层面上来说,这种操作是很繁琐,还不如if else嵌套来的方便,但是这段程序的思想方式还是很值得学习的,把对数字的验证,大写字母的验证,小写字母的验证用对象进行处理,这样在验证中可以携带错误信息。

    相关文章

      网友评论

        本文标题:jdk8 新特性 Optional

        本文链接:https://www.haomeiwen.com/subject/npurhctx.html