package cd.itcast.day1;
import java.util.ArrayList;
/**
* 增强for循环 for..in 关注于数组/集合里面的元素
*
* for(类型 变量名 : 数组/集合){ 变量名... } 增强for循环和普通循环的区别
*
* @author Administrator
*
*/
public class AdvForeach{
public static void main(String[] args) {
String s= null;
OrderItem item1 = new OrderItem(1l, 20d, 10);
OrderItem item2 = new OrderItem(2l, 30d, 10);
//Double total = count(.8, new OrderItem[] { item1, item2, item3 });
//System.out.println(total);
List orderItems = new ArrayList();
orderItems.add(item1);
orderItems.add(item2);
//orderItems.add(item3);
List newOrderItems=filter(30d,orderItems);
System.out.println(newOrderItems);
//total = count(.8, orderItems);
//System.out.println(total);
//
//String ret = StringUtils.join(",", "1", "2", "3");
//System.out.println(ret);
}
/**
* 在数组里面使用for..in 对于数组来说,其实仍然采用的是下标+对象
*
* @param cutoff
* @param items
* @return
*/
private static Double count(Double cutoff, OrderItem... items) {
Double total = 0d;
for (OrderItem item : items) {
total += item.getPrice() * item.getNum();
}
return total * cutoff;
}
/**
* 还能用在集合里面(所有实现了Iterable接口的类都可以使用for..in)
*
* 对于实现了Iterable接口的实现类来说,其实采用的仍然是Iterator的遍历
*
* 当我们理解了for..in对于Iterable的实现原理,有些操作就不能随便来了。
*/
private static Double count(double cutoff, List orderItems) {
Double total = 0d;
for (Object item : orderItems) {
OrderItem temp = (OrderItem) item;
total += temp.getPrice() * temp.getNum();
}
return total * cutoff;
}
/**
* 把低于给定价格的orderItem去掉
* 下面这种使用for..in的方法报错:java.util.ConcurrentModificationException(并发修改错误)
*
* 迭代的原理:
* 如果使用增强for循环,不能在迭代当中使用集合本身的方法来修改集合,只能使用迭代器对应的方法.
* 但是有一个列外,如果集合只有两个元素,操作remove是允许的
*
* @param price
* @param orderItems
* @return
*/
private static List filter(Double price, List orderItems) {
for (Object object : orderItems) {
OrderItem item = (OrderItem) object;
if (item.getPrice() < price) {
orderItems.remove(item);
}
}
//for(Iterator it=orderItems.iterator();it.hasNext();){
//OrderItem item = (OrderItem) it.next();
//if (item.getPrice() < price) {
只能使用跌带器提供的remove方法。
//it.remove();
//}
//}
return orderItems;
}
}