首页 » 编写高质量代码:改善Java程序的151个建议 » 编写高质量代码:改善Java程序的151个建议全文在线阅读

《编写高质量代码:改善Java程序的151个建议》建议71:推荐使用subList处理局部列表

关灯直达底部

我们来看这样一个简单的需求:一个列表有100个元素,现在要删除索引位置为20~30的元素。这很简单,一个遍历很快就可以完成,代码如下:


public static void main(Stringargs){

//初始化一个固定长度,不可变列表

List<Integer>initData=Collections.nCopies(100,0);

//转换为可变列表

List<Integer>list=new ArrayList<Integer>(initData);

//遍历,删除符合条件的元素

for(int i=0,size=list.size();i<size;i++){

if(i>=20&&i<30){

list.remove(i);

}

}

}

或者

for(int i=20;i<30;i++){

if(i<list.size()){

list.remove(i);

}

}


相信首先出现在大家脑海中的实现就是此算法了,遍历一遍,符合条件的就删除,简单而又实用。不过,还有没有其他方式呢?有没有"one-lining"一行代码就解决问题的方式呢?

有,直接使用ArrayList的removeRange方法不就可以了吗?等等,好像不可能呀,虽然JDK上有此方法,但是它有protected关键字修饰着,不能直接使用,那怎么办?看看如下代码。


public static void main(String args){

//初始化一个固定长度,不可变列表

List<Integer>initData=Collections.nCopies(100,0);

//转换为可变列表

ArrayList<Integer>list=new ArrayList<Integer>(initData);

//删除指定范围的元素

list.subList(20,30).clear();

}


上一个建议讲解了subList方法的具体实现方式,所有的操作都是在原始列表上进行的,那我们就用subList先取出一个子列表,然后清空。因为subList返回的List是原始列表的一个视图,删除这个视图中的所有元素,最终就会反映到原始字符串上,那么一行代码即解决问题了。