java必备基础8(for循环、枚举类、自定义注解)

目录

for

倒序推导

正序倒序

枚举类

自定义注解

 代码优化

从数据库获取全量数据,减轻数据库压力,然后处理数据。

for

参考:

倒序推导

Student  student = new Student();
student.setAge(1);
student.setbirthday("19900120");

Student  student1 = new Student();
student1.setAge(0);
student1.setbirthday("19910120");
//构造集合对象
List<Studnet> dataList= new ArrayList();
dataList.add(studnet);
dataList.add(studnet1);

List<String> resultList = new ArrayList();
for(String str :list){
    for(int i = 0; i< dataList.size();i++){
      if("1".equals(dataList.get(i).getAge()){
            resultList.add(dataList.get(i).getBirthday())
        }else{
            //集合长度-(集合长度-i)
            int num =dataList.size()-(dataList.size()-i);
            //倒序便利
            for (int j = num; j >= 0; j--){
              if("19920103".equals(dataList.get(j).getBirthday()){
                  resultList.add(dataList.get(j).getBirthday());
                  break;
              }
            }
        }
        break;
    }
}

正序推导

Student  student = new Student();
student.setAge(1);
student.setbirthday("19900120");

Student  student1 = new Student();
student1.setAge(0);
student1.setbirthday("19910120");
//构造集合对象
List<Studnet> dataList= new ArrayList();
dataList.add(studnet);
dataList.add(studnet1);

List<String> resultList = new ArrayList();
for(String str :list){
    for(int i = 0; i< dataList.size();i++){
      if("1".equals(dataList.get(i).getAge()){
            resultList.add(dataList.get(i).getBirthday())
        }else{
            //i+1便利
            for (int j = i+1; j< dataList.size(); j++){
              if("19920103".equals(dataList.get(j).getBirthday()){
                  resultList.add(dataList.get(j).getBirthday());
                  break;
              }
            }
        }
        break;
    }
}

枚举类

Values()方法用于取得枚举对象的所有值,将枚举类转变为一个枚举类型的数组,因为枚举没有下标,我们没有办法通过下标找到需要的枚举类,这时候转变为数据后,我们就可以通过数组下标,来找到我们需要的枚举值。

@Slf4j
@Getter
public enum EnumTest{
    SiGN("0001","签约费","电子签约费"),
    CONTRACT("00002","合同费用","电子合同费");

    private  String code;
    private  String info;
    private  String digest;
  
    EnumTest(String code,String info,String digest){
      this.code = code;
      this.info = info;
      this.digest = digest;
    }
    
    static EnumTest getEnumTest(String code){
      for( EnumTest  t :EnumTest.values()){
        if( t.getCode().equals(code)){
            return   t;
            }
        }
        return null;
    }

}

自定义注解

注解(Annontation),Java5引入的新特性,位于java.lang.annotation包中。提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。是一种说明、配置、描述性的信息,与具体业务无关,也不会影响正常的业务逻辑。但我们可以用反射机制来进行校验、赋值等操作。

常见的注解:@Override,@author,@param,@Deprecated,@SuppressWarnings。


import java.lang.annotation.*;

/**
 * @author zxh
 * @date 2022/7/14
 * @description 性别赋值
 */

@Retention(RetentionPolicy.RUNTIME)
    //RetentionPolicy.source:仅存在于源码中,编译阶段会被丢弃,不包含与class字节码文件中.像@Override、@SuppressWarnings都属于这类注解.
    //RetentionPolicy.class:默认策略,在class字节码文件中存在,在类加载的时候丢弃,运行时无法获取到.
    //RetentionPolicy.Runtime:始终不丢弃,可以使用反射获得该注解的信息.自定义注解常用的使用方式.
@Target({ElementType.FIELD, ElementType.METHOD})
    //ElementType.type:类、接口、注解、enum.
    //ElementType.constructor:构造函数.
    //ElementType.field:成员变量、对象、属性、枚举的变量.
    //ElementType.Local_variable:局部变量
    //ElementType.method:方法
    //ElementType.package:包
    //ElementType.parameter:参数
    //ElementType.Annotation_type:注解
    //ElementType.type_parameter:类型参数,表示这个注解可以用在Type的声明上前,1.8引入的.
    //ElementType.type_use:类型的注解,表示这个注解可以在所有使用Type的地方(如泛型,类型转换等)1.8引入的.
@Documented
    //标识是否将注解的相关信息添加到javadoc文档中
@Inherited
    //定义该注解和子类的关系,使用此注解声明出来的自定义注解,在使用在类上面时,子类会自动继承此注解,否则,子类不会继承此注解。注意只对类生效,对方法,属性等其他无效。
public @interface InitSex {
    enum SEX_TYPE {MAN, WOMAN}
    SEX_TYPE sex() default SEX_TYPE.MAN;
}

/**
 * @author zxh
 * @date 2022/7/14
 * @description 年龄校验
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
@Inherited
public @interface ValidateAge {
    /**
     * 最小值
     *
     * @return
     */
    int min() default 18;

    /**
     * 最大值
     *
     * @return
     */
    int max() default 99;

    /**
     * 默认值
     *
     * @return
     */
    int value() default 20;
}

/**
 * user
 *
 * @author zzs
 */
public class User {
    private String username;
    @ValidateAge(min = 20, max = 35, value = 22)
    private int age;
    @InitSex(sex = InitSex.SEX_TYPE.MAN)
    private String sex;
    // 省略getter/setter方法
}

测试调用

具体测试调用的过程,参考代码中的注解,其中initUser方法来演示通过反射给属性赋值,checkUser方法通过反射拿到当前属性的值进行对比校验。

import java.lang.reflect.Field;

/**

 * @author zzs

 */

public class TestInitParam {
    public static void main(String[] args) throws IllegalAccessException {
        User user = new User();
        initUser(user);
        // 年龄为0,校验为通过情况
        boolean checkResult = checkUser(user);
        printResult(checkResult);
        // 重新设置年龄,校验通过情况
        user.setAge(22);
        checkResult = checkUser(user);
        printResult(checkResult);

    }

    static void initUser(User user) throws IllegalAccessException {
        // 获取User类中所有的属性(getFields无法获得private属性)
        Field[] fields = User.class.getDeclaredFields();

        // 遍历所有属性

        for (Field field : fields) {
            // 如果属性上有此注解,则进行赋值操作
            if (field.isAnnotationPresent(InitSex.class)) {
                InitSex init = field.getAnnotation(InitSex.class);
                field.setAccessible(true);
                // 设置属性的性别值
                field.set(user, init.sex().toString());
                System.out.println("完成属性值的修改,修改值为:" + init.sex().toString());
            }
        }
    }

    static boolean checkUser(User user) throws IllegalAccessException {

        // 获取User类中所有的属性(getFields无法获得private属性)
        Field[] fields = User.class.getDeclaredFields();
        boolean result = true;

        // 遍历所有属性
        for (Field field : fields) {

            // 如果属性上有此注解,则进行赋值操作
            if (field.isAnnotationPresent(ValidateAge.class)) {
                ValidateAge validateAge = field.getAnnotation(ValidateAge.class);
                field.setAccessible(true);
                int age = (int) field.get(user);
                if (age < validateAge.min() || age > validateAge.max()) {
                    result = false;
                    System.out.println("年龄值不符合条件");
                }
            }
        }
        return result;

    }

    static void printResult(boolean checkResult) {
        if (checkResult) {
            System.out.println("校验通过");
        } else {
            System.out.println("校验未通过");
        }
    }

}

打印日志:

完成属性值的修改,修改值为:MAN

年龄值不符合条件

校验未通过

校验通过

参考:https://zhuanlan.zhihu.com/p/60730622

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

what_2018

你的鼓励是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值