|
|
|
@ -69,6 +69,13 @@ public class BeanRelation {
|
|
|
|
|
return temp;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取关联对象
|
|
|
|
|
* @param bean 实体对象
|
|
|
|
|
* @param holder 关联路径
|
|
|
|
|
* @param <T> 返回关联对象的实体类型
|
|
|
|
|
* @return 若存在多个关联则只取第一个。
|
|
|
|
|
*/
|
|
|
|
|
public static <T extends BaseBean> T get(BaseBean bean, Enum<?> holder) {
|
|
|
|
|
List<T> beans = (List<T>)get(bean).get(holder);
|
|
|
|
|
if (beans == null || beans.isEmpty()) {
|
|
|
|
@ -77,10 +84,27 @@ public class BeanRelation {
|
|
|
|
|
return beans.get(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取关联对象
|
|
|
|
|
* @param bean 实体对象
|
|
|
|
|
* @param holder 第一个关联路径
|
|
|
|
|
* @param args 后续关联路径
|
|
|
|
|
* @param <T> 返回关联对象的实体类型
|
|
|
|
|
* @return 若存在多个关联则只取第一个。
|
|
|
|
|
*/
|
|
|
|
|
public static <T extends BaseBean> T get(BaseBean bean, Enum<?> holder, Enum<?>... args) {
|
|
|
|
|
return get(bean, null, holder, args);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 根据筛选条件获取关联对象
|
|
|
|
|
* @param bean 实体对象
|
|
|
|
|
* @param pred Lambda表达式,用来筛选关联对象,返回true则符合筛选条件
|
|
|
|
|
* @param holder 第一个关联路径
|
|
|
|
|
* @param args 后续关联路径
|
|
|
|
|
* @param <T> 返回关联对象的实体类型
|
|
|
|
|
* @return 只找第一个符合筛选条件的关联对象。
|
|
|
|
|
*/
|
|
|
|
|
public static <T extends BaseBean> T get(BaseBean bean, Predicate<T> pred, Enum<?> holder, Enum<?>... args) {
|
|
|
|
|
List<BaseBean> nextBeans = list(bean, holder);
|
|
|
|
|
for (BaseBean nextEntity : nextBeans) {
|
|
|
|
@ -111,6 +135,13 @@ public class BeanRelation {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取关联对象集合
|
|
|
|
|
* @param bean 实体对象
|
|
|
|
|
* @param holder 关联路径
|
|
|
|
|
* @param <T> 返回关联对象的实体类型
|
|
|
|
|
* @return 返回的List集合非拷贝的,外界不能对其修改。
|
|
|
|
|
*/
|
|
|
|
|
public static <T extends BaseBean> List<T> list(BaseBean bean, Enum<?> holder) {
|
|
|
|
|
List<T> beans = (List<T>)get(bean).get(holder);
|
|
|
|
|
if (beans == null) {
|
|
|
|
@ -119,10 +150,27 @@ public class BeanRelation {
|
|
|
|
|
return beans;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取关联对象集合
|
|
|
|
|
* @param bean 实体对象
|
|
|
|
|
* @param holder 第一个关联路径
|
|
|
|
|
* @param args 后续关联路径
|
|
|
|
|
* @param <T> 返回关联对象的实体类型
|
|
|
|
|
* @return 返回的List集合为拷贝的,外界可以对其修改。
|
|
|
|
|
*/
|
|
|
|
|
public static <T extends BaseBean> List<T> list(BaseBean bean, Enum<?> holder, Enum<?>... args) {
|
|
|
|
|
return list(bean, null, holder, args);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取符合筛选条件的关联对象集合
|
|
|
|
|
* @param bean 实体对象
|
|
|
|
|
* @param pred Lambda筛选表达式,返回true为筛选出来的对象。
|
|
|
|
|
* @param holder 第一个关联路径
|
|
|
|
|
* @param args 后续关联路径
|
|
|
|
|
* @param <T> 返回关联对象的实体类型
|
|
|
|
|
* @return 返回的List集合为拷贝的,外界可以对其修改。
|
|
|
|
|
*/
|
|
|
|
|
public static <T extends BaseBean> List<T> list(BaseBean bean, Predicate<T> pred, Enum<?> holder, Enum<?>... args) {
|
|
|
|
|
List<T> result = new ArrayList<>();
|
|
|
|
|
List<BaseBean> nextBeans = list(bean, holder);
|
|
|
|
@ -157,6 +205,38 @@ public class BeanRelation {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static <T extends BaseBean> List<T> lastList(BaseBean entity, Enum<?>... args) {
|
|
|
|
|
List<T> result = new ArrayList<T>();
|
|
|
|
|
lastListImpl(result, entity, null, args, 0);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static <T extends BaseBean> List<T> lastList(BaseBean entity, Predicate<T> filter, Enum<?>... args) {
|
|
|
|
|
List<T> result = new ArrayList<T>();
|
|
|
|
|
lastListImpl(result, entity, filter, args, 0);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@SuppressWarnings("unchecked")
|
|
|
|
|
private final static <T extends BaseBean> boolean lastListImpl(List<T> result, BaseBean entity, Predicate<T> filter,
|
|
|
|
|
Enum<?>[] args, int index) {
|
|
|
|
|
if (index >= args.length) {
|
|
|
|
|
index = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
boolean bNotLast = true;
|
|
|
|
|
List<BaseBean> relaEntities = list(entity, args[index]);
|
|
|
|
|
for (BaseBean relaEntity : relaEntities) {
|
|
|
|
|
if (lastListImpl(result, relaEntity, filter, args, index + 1)) {
|
|
|
|
|
result.add((T)relaEntity);
|
|
|
|
|
bNotLast = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return index == 0 && bNotLast;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 设值两个对象之间的关联
|
|
|
|
|
*
|
|
|
|
@ -282,4 +362,42 @@ public class BeanRelation {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 按指定路径,递归调用lambda表达式,当lambda表达式返回false或路径存在循环则退出递归。
|
|
|
|
|
* @param bean
|
|
|
|
|
* @param fun
|
|
|
|
|
* @param holders
|
|
|
|
|
* @param <T>
|
|
|
|
|
*/
|
|
|
|
|
public static <T extends BaseBean> void recursion(BaseBean bean, Predicate<T> fun, Enum<?>... holders) {
|
|
|
|
|
if (holders.length == 0) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
recursionImpl(bean, fun, holders, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 按指定路径,递归调用实现。采用广度优先搜索。
|
|
|
|
|
* @param bean
|
|
|
|
|
* @param fun
|
|
|
|
|
* @param holders
|
|
|
|
|
* @param index
|
|
|
|
|
* @param <T>
|
|
|
|
|
*/
|
|
|
|
|
@SuppressWarnings("unchecked")
|
|
|
|
|
private final static <T extends BaseBean> void recursionImpl(BaseBean bean, Predicate<T> fun,
|
|
|
|
|
Enum<?>[] holders, int index) {
|
|
|
|
|
if (index >= holders.length) {
|
|
|
|
|
if (!fun.test((T) bean)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
index = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
List<BaseBean> relaBeans = list(bean, holders[index]);
|
|
|
|
|
for (BaseBean relaBean : relaBeans) {
|
|
|
|
|
recursionImpl(relaBean, fun, holders, index + 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|