toArray
public <T> T[] toArray(T[] a)
-
按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。如果指定的数组能容纳列表,则将该列表返回此处。否则,将分配一个具有指定数组的运行时类型和此列表大小的新数组。
如果指定的数组能容纳队列,并有剩余的空间(即数组的元素比队列多),那么会将数组中紧接 collection 尾部的元素设置为 null。(仅 在调用者知道列表中不包含任何 null 元素时才能用此方法确定列表长度)。
-
-
指定者:
-
接口
Collection<E>
中的toArray
指定者:
-
接口
List<E>
中的toArray
覆盖:
-
类
AbstractCollection<E>
中的toArray
-
接口
-
-
参数:
-
a
- 要在其中存储列表元素的数组(如果它足够大);否则,为此分配一个具有相同运行时类型的新数组。
返回:
- 包含列表元素的数组 抛出:
-
ArrayStoreException
- 如果指定数组的运行时类型不是此列表每个元素的运行时类型的超类型 -
NullPointerException
- 如果指定数组为 null
-
//构造一个specification条件接口对象,使用内部类方式创建
Specification specification = new Specification<Courier>(){
//重写其toPredicate方法达成为specification赋予条件的目的
@Override
//Root 用于获取属性字段,CriteriaQuery可以用于简单条件查询,CriteriaBuilder 用于构造复杂条件查询
public Predicate toPredicate(Root<Courier> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
//创建集合逐个添加条件
List<Predicate> list = new ArrayList<Predicate>();
//简单查询
//创建条件1:先做判断,如果获取的属性值不为空,才创建这个条件对象;属性名courierNum是否与模型驱动中取的值一致
//StringUtils要导commons.lang3包下的
if(StringUtils.isNotBlank(courier.getCourierNum())){
Predicate p1 = cb.equal(root.get("courierNum").as(String.class), courier.getCourierNum());
list.add(p1);
}
//创建条件2:所属单位
if(StringUtils.isNotBlank(courier.getCompany())){
Predicate p2 = cb.like(root.get("company").as(String.class), "%"+courier.getCompany()+"%");
list.add(p2);
}
//创建条件3:取件员类型
if(StringUtils.isNotBlank(courier.getType())){
Predicate p3 = cb.equal(root.get("type").as(String.class), courier.getType());
list.add(p3);
}
//复杂查询条件:
//创建条件4:收派标准是否一致,利用root对象先创建join对象:对于前面的单层获取而言相当于双层获取
//泛形是多:快递员,一:收派标准,而join方法给的是属性字段名和连接类型
Join<Courier, Standard> standardJoin = root.join("standard", JoinType.INNER);
if(courier.getStandard()!=null&&StringUtils.isNotBlank(courier.getStandard().getName())){
Predicate p4 = cb.like(standardJoin.get("name").as(String.class), "%"+courier.getStandard().getName()+"%");
list.add(p4);
}
//将集合转成Predicate对象返回:参数传一个Predicate数组
//new Predicate[0]就起到一个泛型的作用:★★★???不是很明白这里
//这里的new Predicate[0]是使用匿名内部类的多态方式创建一个Predicate接口的长度为0的数组,
//作为list.toArray后这个数组的泛型指定,类似于Array <Predicate[]> list = new ArrayList<Predicate[]>;
//这里面放的Predicate[]就是作为泛型参数,用于toArray方法本来就支持这种传数组作为参数的写法
return cb.and(list.toArray(new Predicate[0]));
}
};