目录
代码优化
从数据库获取全量数据,减轻数据库压力,然后处理数据。
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