小鸦之设计模式(5)-(Iterator pattern)迭代模式很糟糕吗

刚学Java的时候, 就觉得迭代器是一个奇怪的东西.
1 . 为什么使用遍历容器的时候, 要用Iterator.

    public static void print(Collection coll){
        Iterator it = coll.iterator();
        while(it.hasNext()){
            String str = (String)it.next();
            System.out.println(str);
        }
    }

这很不直观. 我期望的是 iterate(遍历)是一个method, 而不是单独分出来的一个概念. 而且现实生活中, 我们没有相对应的事物.
其次, 它总是需要调用next和hasnext方式.

虽然匿名函数不是最好的方法, 但至少, 它可以保证不需要对类进行操作却可以添加实现方法

new List.doIterator(new Collection()){
        doIterator(item it){
            String str = (String)it.next();
            System.out.println(str);
        }
    }
}

这里, 使用IDE的提示功能的话, 其代码会变成这样

new List.doIterator(new Collection()){
        doIterator(iterator it){
            //TODO
        }
    }
}

相对明了点.
而Java 8 lambda中, 则会变成

new List.doIterator(iterator it)->{
    //TODO
    }
}

Java 8中则是用这种方式

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
list.forEach(n -> System.out.println(n));

PS: 以上形式也是一个坑, foreach其实不能修改value. 可以用replaceAll什么的代替( 挺莫名其妙的说..)


参考: Iterator pattern - why is it important to not expose the internal representation?

迭代模式的好处, 主要是在于可以分离 「迭代对象」 和 「容器」,这种好处在于开发者是两个以上. 但是对于开发者只有一个的情况, 我认为这是一个糟糕的想法.

综上, 最好的结果就是, 两种方式都添加到设计里, 让开发者可以自由选择

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值