pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

為什么 Java 不允許在迭代器上使用 foreach(僅在可

Why does Java not allow foreach on iterators (only on iterables)?(為什么 Java 不允許在迭代器上使用 foreach(僅在可迭代對(duì)象上)?)
本文介紹了為什么 Java 不允許在迭代器上使用 foreach(僅在可迭代對(duì)象上)?的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!

問(wèn)題描述

可能重復(fù):
為什么Java的Iterator不是Iterable?

給定for-each循環(huán)的慣用方式迭代器?

我們可以使用用于迭代Iterator類(lèi)型對(duì)象的for-each循環(huán)?

據(jù)我所知,foreach 循環(huán)是 Java 5 中添加的語(yǔ)法糖.所以

The foreach loop are as far as I know syntax sugar added in Java 5. So

Iterable<O> iterable;
for(O o : iterable) {
    // Do something
}

基本上會(huì)產(chǎn)生與

Iterable<O> iterable;
for(Iterator<O> iter = iterable.iterator(); iter.hasNext(); /* NOOP */) {
    O o = iter.next();
    // Do something
}

但是,如果我一開(kāi)始沒(méi)有可迭代對(duì)象,而只有一個(gè)迭代器(比如說(shuō),因?yàn)橐粋€(gè)類(lèi)提供了兩個(gè)不同的迭代器),我就不能使用語(yǔ)法糖 foreach 循環(huán).顯然我仍然可以進(jìn)行簡(jiǎn)單的舊樣式迭代.但是,我實(shí)際上想做:

However, if I do not have an iterable in the first place, but only an iterator (say, because a class offers two different iterators), I cannot use the syntax sugar foreach loop. Obviously I can still do the plain old style iteration. However, I'd actually like to do:

Iterator<O> iter;
for(O o : iter /* Iterator<O>, not Iterable<O>! */) {
     // Do something
}

當(dāng)然我可以做一個(gè)假的Iterable:

And of course I can do a fake Iterable:

class Adapter<O> implements Iterable<O> {
    Iterator<O> iter;

    public Adapter(Iterator<O> iter) {
        this.iter = iter;
    }

    @Override
    public Iterator<O> iterator() {
        return iter;
    }
}

(這實(shí)際上是對(duì) Iterable API 的丑陋濫用,因?yàn)樗荒艿淮危?

(Which in fact is an ugly abuse of the Iterable API, as it can only be iterated once!)

如果它是圍繞 Iterator 而不是 iterable 設(shè)計(jì)的,可以做很多有趣的事情:

If it were designed around Iterator instead of iterable, one could do a number of interesting things:

for(O o : iterable.iterator()) {} // Iterate over Iterable and Collections

for(O o : list.backwardsIterator()) {} // Or backwards

Iterator<O> iter;
for(O o : iter) {
    if (o.something()) { iter.remove(); }
    if (o.something()) { break; }
}
for(O : iter) { } // Do something with the remaining elements only.

有人知道為什么語(yǔ)言是這樣設(shè)計(jì)的嗎?如果一個(gè)類(lèi)同時(shí)實(shí)現(xiàn) IteratorIterable,為了避免歧義?為了避免假定for(O o : iter)"的程序員錯(cuò)誤;將處理所有元素兩次(并忘記獲取新的迭代器)?還是有其他原因?

Does anyone know why the language was designed this way? To avoid ambiguity if a class would implement both Iterator and Iterable? To avoid programmer errors that assume that "for(O o : iter)" will process all elements twice (and forget to get a fresh iterator)? Or is there some other reason for this?

還是有一些我不知道的語(yǔ)言技巧?

Or is there some language trick I just do not know?

推薦答案

所以我現(xiàn)在有了一個(gè)比較合理的解釋:

So I have a somewhat reasonable explanation now:

短版:因?yàn)檎Z(yǔ)法也適用于沒(méi)有迭代器的數(shù)組.

Short version: Because the syntax also applies to arrays, which don't have iterators.

如果語(yǔ)法是按照我的建議圍繞 Iterator 設(shè)計(jì)的,它將與數(shù)組不一致.讓我給出三個(gè)變體:

If the syntax were designed around Iterator as I proposed, it would be inconsistent with arrays. Let me give three variants:

A) 由 Java 開(kāi)發(fā)人員選擇:

A) as chosen by the Java developers:

Object[] array;
for(Object o : array) { }
Iterable<Object> list;
for(Object o : list) { }
Iterator<Object> iter;
while(iter.hasNext()) { Object o = iter.next(); }

行為方式相同,并且在數(shù)組和集合之間高度一致.然而,迭代器必須使用經(jīng)典的迭代風(fēng)格(至少不會(huì)導(dǎo)致錯(cuò)誤).

The behaves the same way and is highly consistent across arrays and collections. Iterators however have to use the classic iteration style (which at least is not likely to cause errors).

B) 允許數(shù)組和Iterators:

Object[] array;
for(Object o : array) { }
Iterable<Object> list;
for(Object o : list.iterator()) { }
Iterator<Object> iter;
for(Object o : iter) { }

現(xiàn)在數(shù)組和集合不一致;但是數(shù)組和 ArrayList 密切相關(guān),應(yīng)該表現(xiàn)相同.現(xiàn)在,如果在任何時(shí)候,該語(yǔ)言將被 擴(kuò)展 以制作例如數(shù)組實(shí)現(xiàn)了Iterable,就變得不一致了.

Now arrays and collections are inconsistent; but arrays and ArrayList are very closely related and should behave the same way. Now if at any point, the language is extended to make e.g. arrays implement Iterable, it becomes inconsistent.

C) 允許所有三個(gè):

Object[] array;
for(Object o : array) { }
Iterable<Object> list;
for(Object o : list) { }
Iterator<Object> iter;
for(Object o : iter) { }

現(xiàn)在,如果我們最終處于不清楚的情況下,當(dāng)有人實(shí)現(xiàn) both IterableIterator 時(shí)(for 循環(huán)是否應(yīng)該得到一個(gè)新的迭代器或迭代當(dāng)前 - 在樹(shù)狀結(jié)構(gòu)中很容易發(fā)生!?!).不幸的是,一個(gè)簡(jiǎn)單的 tie-braker ala Iterable beats Iterator"是行不通的:它突然引入了運(yùn)行時(shí)與編譯時(shí)間差異和泛型問(wèn)題.

Now if we end up in unclear situations when either someone implements both Iterable and Iterator (is the for loop supposed to get a new iterator or iterate over the current - happens easily in tree-like structures!?!). A simple tie-braker ala "Iterable beats Iterator" unfortunately won't do: it suddenly introduces runtime vs. compile time difference and generics issues.

現(xiàn)在突然間,我們需要注意是要迭代集合/可迭代對(duì)象還是數(shù)組,此時(shí)我們以大混亂為代價(jià)獲得了很少的好處.

Now suddenly, we need to pay attention to whether we want to iterate over collections/iterables or arrays, at which point we have gained very little benefits at the cost of a big confusion.

Java (A) 中for each"的方式非常一致,它導(dǎo)致的編程錯(cuò)誤非常少,并且允許將來(lái)可能將數(shù)組轉(zhuǎn)換為常規(guī)對(duì)象.

The way "for each" is in Java (A) is very consistent, it causes very little programming errors, and it allows for the possible future change of turning arrays into regular objects.

有一個(gè)變體 D) 可能也可以正常工作:for-each 僅適用于迭代器.最好通過(guò)向原始數(shù)組添加 .iterator() 方法:

There is a variant D) that would probably also work okay: for-each for Iterators only. Preferrably by adding a .iterator() method to primitive arrays:

Object[] array;
for(Object o : array.iterator()) { }
Iterable<Object> list;
for(Object o : list.iterator()) { }
Iterator<Object> iter;
for(Object o : iter) { }

但這需要更改運(yùn)行時(shí)環(huán)境,而不僅僅是編譯器,并且會(huì)破壞向后兼容性.另外,上面提到的混淆仍然存在,

But this requires changes to the runtime environment, not just the compiler, and breaks backwards compatibility. Plus, the mentioned confusion is still present that

Iterator<Object> iter;
for(Object o : iter) { }
for(Object o : iter) { }

只對(duì)數(shù)據(jù)進(jìn)行一次迭代.

Only iterates over the data once.

這篇關(guān)于為什么 Java 不允許在迭代器上使用 foreach(僅在可迭代對(duì)象上)?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來(lái)源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問(wèn)題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請(qǐng)聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

Java Remove Duplicates from an Array?(Java從數(shù)組中刪除重復(fù)項(xiàng)?)
How to fix Invocation failed Unexpected Response from Server: Unauthorized in Android studio(如何修復(fù)調(diào)用失敗來(lái)自服務(wù)器的意外響應(yīng):在 Android 工作室中未經(jīng)授權(quán))
AES encryption, got extra trash characters in decrypted file(AES 加密,解密文件中有多余的垃圾字符)
AES Error: Given final block not properly padded(AES 錯(cuò)誤:給定的最終塊未正確填充)
Detecting incorrect key using AES/GCM in JAVA(在 JAVA 中使用 AES/GCM 檢測(cè)不正確的密鑰)
AES-256-CBC in Java(Java 中的 AES-256-CBC)
主站蜘蛛池模板: 我车网|我关心的汽车资讯_汽车图片_汽车生活!| 好杂志网-首页 | 上海新光明泵业制造有限公司-电动隔膜泵,气动隔膜泵,卧式|立式离心泵厂家 | 聚丙烯酰胺PAM-聚合氯化铝PAC-絮凝剂-河南博旭环保科技有限公司 巨野电机维修-水泵维修-巨野县飞宇机电维修有限公司 | 冷却塔厂家_冷却塔维修_冷却塔改造_凉水塔配件填料公司- 广东康明节能空调有限公司 | 流量检测仪-气密性检测装置-密封性试验仪-东莞市奥图自动化科技有限公司 | VI设计-LOGO设计公司-品牌设计公司-包装设计公司-导视设计-杭州易象设计 | 河南道路标志牌_交通路标牌_交通标志牌厂家-郑州路畅交通 | 武汉画册印刷厂家-企业画册印刷-画册设计印刷制作-宣传画册印刷公司 - 武汉泽雅印刷厂 | 欧盟ce检测认证_reach检测报告_第三方检测中心-深圳市威腾检验技术有限公司 | 合肥礼品公司-合肥礼品定制-商务礼品定制公司-安徽柏榽商贸有限公司 | 钢衬玻璃厂家,钢衬玻璃管道 -山东东兴扬防腐设备有限公司 | 塑胶跑道_学校塑胶跑道_塑胶球场_运动场材料厂家_中国塑胶跑道十大生产厂家_混合型塑胶跑道_透气型塑胶跑道-广东绿晨体育设施有限公司 | 谈股票-今日股票行情走势分析-牛股推荐排行榜 | 纸塑分离机-纸塑分离清洗机设备-压力筛-碎浆机厂家金双联环保 | 会议会展活动拍摄_年会庆典演出跟拍_摄影摄像直播-艾木传媒 | 步进_伺服_行星减速机,微型直流电机,大功率直流电机-淄博冠意传动机械 | HDPE土工膜,复合土工膜,防渗膜价格,土工膜厂家-山东新路通工程材料有限公司 | 电动液压篮球架_圆管地埋式篮球架_移动平箱篮球架-强森体育 | 谷歌关键词优化-外贸网站优化-Google SEO小语种推广-思亿欧外贸快车 | 特种阀门-调节阀门-高温熔盐阀-镍合金截止阀-钛阀门-高温阀门-高性能蝶阀-蒙乃尔合金阀门-福建捷斯特阀门制造有限公司 | 煤棒机_增碳剂颗粒机_活性炭颗粒机_木炭粉成型机-巩义市老城振华机械厂 | 依维柯自动挡房车,自行式国产改装房车,小型房车价格,中国十大房车品牌_南京拓锐斯特房车 - 南京拓锐斯特房车 | 炉门刀边腹板,焦化设备配件,焦化焦炉设备_沧州瑞创机械制造有限公司 | 小区健身器材_户外健身器材_室外健身器材_公园健身路径-沧州浩然体育器材有限公司 | 最新电影-好看的电视剧大全-朝夕电影网 | 金属软管_不锈钢金属软管_巩义市润达管道设备制造有限公司 | 热处理温控箱,热处理控制箱厂家-吴江市兴达电热设备厂 | 上海瑶恒实业有限公司|消防泵泵|离心泵|官网| 厂房出售_厂房仓库出租_写字楼招租_土地出售-中苣招商网-中苣招商网 | 垃圾处理设备_餐厨垃圾处理设备_厨余垃圾处理设备_果蔬垃圾处理设备-深圳市三盛环保科技有限公司 | 武汉刮刮奖_刮刮卡印刷厂_为企业提供门票印刷_武汉合格证印刷_现金劵代金券印刷制作 - 武汉泽雅印刷有限公司 | 热缩管切管机-超声波切带机-织带切带机-无纺布切布机-深圳市宸兴业科技有限公司 | 玉米加工设备,玉米深加工机械,玉米糁加工设备.玉米脱皮制糁机 华豫万通粮机 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 光栅尺_Magnescale探规_磁栅尺_笔式位移传感器_苏州德美达 | 并网柜,汇流箱,电控设备,中高低压开关柜,电气电力成套设备,PLC控制设备订制厂家,江苏昌伟业新能源科技有限公司 | 寮步纸箱厂_东莞纸箱厂 _东莞纸箱加工厂-东莞市寮步恒辉纸制品厂 | U拓留学雅思一站式服务中心_留学申请_雅思托福培训 | 防爆电机_防爆电机型号_河南省南洋防爆电机有限公司 | 品牌策划-品牌设计-济南之式传媒广告有限公司官网-提供品牌整合丨影视创意丨公关活动丨数字营销丨自媒体运营丨数字营销 |