在给定迭代器的情况下使用 for-each 循环的惯用方法?

2023-12-25

当增强的 for 循环(foreach 循环)被添加到 Java 中时,它可以处理数组或数组的目标Iterable.

for ( T item : /*T[] or Iterable<? extends T>*/ ) {
    //use item
}

这对于仅实现一种迭代类型的 Collection 类非常有用,因此具有单个iterator() method.

但当我想使用 Collection 类中的非标准迭代器时,我发现自己非常沮丧。例如,我最近试图帮助某人使用Deque作为 LIFO/堆栈,然后按 FIFO 顺序打印元素。我被迫这样做:

for (Iterator<T> it = myDeque.descendingIterator(); it.hasNext(); ) {
   T item = it.next();
   //use item
}

我失去了 for-each 循环的优点。这不仅仅是击键的问题。如果不需要的话,我不喜欢公开迭代器,因为很容易犯调用错误it.next()两次等

现在理想情况下,我认为 for-each 循环应该接受一个Iterator以及。但事实并非如此。那么在这种情况下有没有一种使用 for-each 循环的惯用方法呢?我也很想听到使用 Guava 等常见集合库的建议。

在没有辅助方法/类的情况下我能想到的最好的方法是:

for ( T item : new Iterable<T>() { public Iterator<T> iterator() { return myDeque.descendingIterator(); } } ) {
    //use item
}

哪个不值得使用。

我很想看到番石榴有类似的东西Iterables.wrap使这成为惯用语,但没有找到类似的东西。显然,我可以通过类或辅助方法推出我自己的迭代器包装器。还有其他想法吗?

Edit:作为旁注,任何人都可以给出一个有效的理由来解释为什么增强的 for 循环不应该只接受一个Iterator?这可能会对我接受当前的设计大有帮助。


为什么增强的 for 循环不只接受迭代器?

我想从各种答案中收集一些潜在原因,了解为什么 for-each 循环不简单地接受迭代器。

  1. 方便:创建 for-each 循环的部分原因是为了方便执行给定集合中每个元素的操作的常见操作。它没有义务或意图取代迭代器的显式使用(显然如果你想删除元素,你需要对迭代器的显式引用)。
  2. 可读性:for-each 循环for ( Row r : table )意味着非常具有可读性,如“对于表中的每一行“r”......”。看见for ( Row r : table.backwardsIterator() )破坏了可读性。
  3. 透明度:如果一个对象既是Iterable and an Iterator,将会有什么行为?尽管制定一致的规则很容易(例如,Iterable 在 Iterator 之前),但行为对开发人员来说不太透明。此外,必须在编译时检查这一点。
  4. 封装/范围:(我认为)这是最重要的原因。 for-each 循环旨在封装Iterator并将其范围限制为循环。这使得循环以两种方式“只读”:它不公开迭代器,这意味着没有任何(容易)有形的东西改变了其状态by循环,也不能改变操作数的状态in循环(就像您可以通过直接与迭代器交互一样remove())。自己传递迭代器必然意味着迭代器被公开,从而使您失去循环的两个“只读”属性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在给定迭代器的情况下使用 for-each 循环的惯用方法? 的相关文章

  • 任务“:app:dexDebug”执行失败

    我目前正在处理我的项目 我决定将我的 Android Studio 更新到新版本 但在我导入项目后 它显示如下错误 Information Gradle tasks app assembleDebug app preBuild UP TO
  • java.lang.Class: 在 java 程序中初始化 log4j 属性文件时出错

    我正在尝试使用 log4j 运行独立的 java 程序 但在调试时收到以下消息 控制台上没有 log4j 相关日志 log Logger 1343 java lang Class ERROR in 18b4aac2 有人可以建议这里出了什么
  • 无法加载 jar 文件的主类

    我使用 Eclipse IDE 开发了一个应用程序 创建应用程序后 我以 jar 格式导出项目 当我尝试运行此 jar 文件时 出现错误 无法加载主类 请帮忙 当您将项目导出为 jar 时 请参阅此所以问题 https stackoverf
  • 使用 Spring 时实例化对象,用于测试与生产

    使用 Spring 时 应该使用 Spring 配置 xml 来实例化生产对象 并在测试时直接实例化对象 这样的理解是否正确 Eg MyMain java package org world hello import org springf
  • Java 泛型/类型调度问题

    考虑以下程序 import java util List import java util ArrayList public class TypeTest public static class TypeTestA extends Type
  • Java 变量的作用域

    我不明白为什么这段代码的输出是10 package uno public class A int x 10 A int x 12 new B public static void main String args int x 11 new
  • spring - 强制 @Autowired 字段的 cglib 代理

    我有混合堆栈 EJB 和 Spring 为了将 Spring 自动装配到 EJB 我使用SpringBeanAutowiringInterceptor 不确定这是否会影响我遇到的问题 在尝试通过以下方式自动装配 bean 时 Scope p
  • 想要开发像 Facebook 这样的网站 - 处理数百万个请求 - 高性能 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想用 Java 开发一个像 Fac
  • @EnableTransactionManagement 的范围是什么?

    我试图了解正确的放置位置 EnableTransactionManagement多个 JavaConfig 上下文的情况下的注释 考虑以下场景 我在 JPAConfig java 和 AppConfig java 中有 JPA 配置以及一组
  • 打印包含 JBIG2 图像的 PDF

    请推荐一些库 帮助我打印包含 JBIG2 编码图像的 PDF 文件 PDFRenderer PDFBox别帮我 这些库可以打印简单的 PDF 但不能打印包含 JBIG2 图像的 PDF PDFRenderer尝试修复它 根据 PDFRedn
  • 从 Java 日历迁移到 Joda 日期时间

    以前 当我第一次设计股票应用相关软件时 我决定使用java util Date表示股票的日期 时间信息 后来我体会到了大部分方法java util Date已弃用 因此 很快 我重构了所有代码以利用java util Calendar 然而
  • 让JScrollPane控制多个组件

    对于我的应用程序 我正在设计一个脚本编辑器 目前我有一个JPanel其中包含另一个JPanel保存行号 位于左侧 以及JTextArea用于允许用户输入代码 位于右侧 目前 我已经实施了JScrollPane on the JTextAre
  • 如何为 Jackson 编写一个包罗万象的(反)序列化器

    当您提前知道类型时 编写自定义序列化器非常容易 例如 MyType一个人可以写一个MyTypeSerializer extends StdSerializer
  • 如何在keycloak中动态编辑standalone.xml文件

    我正在尝试通过 docker 编辑standalone xml 并尝试添加 但 keycloak 正在使用它standalone xml 但我可以看到standalone xml 文件中的更改 我需要在standalone xml 文件中添
  • 在 Selenium WebDriver 上如何从 Span 标签获取文本

    在 Selenium Webdriver 上 如何从 span 标记检索文本并打印 我需要提取文本UPS Overnight Free HTML代码如下 div id customSelect 3 class select wrapper
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • 从java中的字符串数组中删除空值

    java中如何从字符串数组中删除空值 String firstArray test1 test2 test4 我需要像这样没有 null 空 值的 firstArray String firstArray test1 test2 test4
  • Java 编码风格、局部变量与重复方法调用

    我更喜欢使用局部变量而不是多次调用同一方法 I prefer this Vehicle vehicle person getVehicle if vehicle instanceof Car Car car Car vehicle car
  • java中如何找到class文件的包

    我正在编写一个使用 class 文件的 java 程序 我希望能够读取文件系统上的 class 文件 使用 InputStream 并确定它所在的包 该 class 文件可能不在一个好的包目录结构中 它可能位于某个随机位置 我怎样才能做到这
  • 使用 eclipse IDE 配置 angularjs

    我想开始使用 AngularJs 和 Java Spring 进行开发 我使用 Eclipse 作为 IDE 我想配置我的 Eclipse 以使这些框架无缝工作 我知道我可能要求太多 但相信我 我已经做了很多研究 你们是我最后的选择 任何帮

随机推荐

  • 如何将无序列表项放入数组中

    我的代码是 如何使用本机 JavaScript 将每个列表项中的文本放入数组中 ul li List Item 1 li li List Item 2 li li List Item 3 li li List Item 4 li ul
  • Apple M1 - Maven Java 依赖项尚不适用于 macosx-arm64

    我正在尝试让 Java Maven 项目在 Apple M1 上运行 其依赖项尚不适用于 M1 芯片 就我而言 这是 nd4j 但它可能是任何其他依赖项
  • 使用 usecols 时 pandas 保留索引列

    这是我的问题的重新措辞版本 希望更有意义 使用时read csv使用隐式索引 即文件中的第一列没有标题 一切正常 我得到一个数据帧 其索引是文件中的第一列 隐式索引列 但是 如果我指定usecols作为一个论点read csv 隐式索引列将
  • 使用 CakePHP 和 Bootstrap 形成复选框和标签

    我在尝试使用 CakePHP 和 Twitter Bootstrap 获取复选框输入和标签以输出正确的 HTML 时遇到一些问题 Bootstrap 的具体输出应该是 div class control group div class co
  • 在 WebApi 中,我应该在哪里保存 ActionFilter 调用之间的数据?

    我有一个动作过滤器属性 http msdn microsoft com en us library system web http filters actionfilterattribute 28v vs 108 29 aspx它在目标操作
  • WMODE 和 Flash 视频 - 稳定性和性能

    出于商业原因 我需要在 Flash 视频播放器中添加 HTML 内容 这需要将 WMODE 设置为 不透明 然而 Flash Player 工程 Tinic Uro 警告我们性能较低 http www kaourantin net 2010
  • 反射大师:为什么我的 MethodInfo 对象不相等?

    基本上 一些在静态中发生的内部检查System Linq Expressions Expression Bind 方法在我的属性上说 方法不是属性访问器 这显然是一个属性 使用 Reflector 我已经最大限度地减少了导致问题的代码量 而
  • 如何避免运行 apt-get Upgrade 后出现 GRUB 错误 - Ubuntu [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 EC2 上运行 ubuntu 14 04 运行 apt get update 后 系统会出现一个屏幕提示 要求我重新安装 GRUB
  • 有没有办法知道链接/脚本是否仍待处理或已失败

    我想从下面的html中知道 如果link rel import link rel stylesheet img and script are 待处理 加载 失败 中止无需事先添加侦听器 也无需在事件发生后的任何时候添加侦听器
  • Android Tesseract进度回调

    所以我终于设法得到了Android 超立方工具 http code google com p tesseract android tools 编译 一切都按预期进行 除了我不介意某种进度回调 我查看了包装类和本机包装 cpp 代码 但没有任
  • 如何在 XSLT 中执行类似“while”的循环?

    我是 XSLT 的新手 并且在这个问题上遇到了很多困难 我需要在 XSLT 中执行类似 while 的循环 我认为 for each 不足以解决这个问题 我有一个变量 它是 SELECT 语句的结果 它可以返回 0 或整数 如果值为0 则需
  • 如何在 Gradle 的 Kotlin DSL 上构建的多项目中禁用 distZip

    我已经使用 Kotlin DSL 设置了 Gradle 多项目构建 这是build gradle kts在根中 plugins kotlin jvm version 1 2 70 apply false allprojects reposi
  • 保证 TCP 数据包大小

    我们使用嵌入式设备通过串行以太网转换器将数据包从串行端口发送到服务器 我们使用的一家制造商 Moxa 将始终以与数据包构造相同的方式发送数据包 这意味着 如果我们构造一个大小为 255 的数据包 它将始终以 255 长度发送数据包 另一个制
  • 将多个 URL 路由到 Spring Boot Actuator 健康端点

    我有一个应用程序配置为在 manage health 处提供 Spring Boot Actuator 的运行状况端点 不幸的是 由于我要部署的基础设施的一些细节 我需要将 和 health 别名为 manage health 我没有看到通
  • 刷新 Teams Bot 图标 + 名称

    我更新了 Bot Framework 机器人的名称 图标 在 Teams 中 我看不到更新它的方法 我记得必须手动删除程序文件中的一些缓存文件夹 但想知道是否有更简单的方法 来自 Web 的 Teams 中的机器人与我的本地缓存关系不大 并
  • Spring Security SAML:从 saml2p:Response 中提取属性作为用户属性

    昨天我深入研究了 Spring Security yaml 以使其与 Okta SAML 一起使用 登录可以正常工作 但响应 XML 包含显然无法自动提取到属性映射中的用户属性 响应包含这样的字段
  • SetConsoleMode 失败并为零,lasterror = 0

    这不是重复的 嗯 读完评论后 也许是这样 我正在寻找一种在 c Visual Studio 2015 目标 NET Framework 4 5 2 OS Windows 7 中将控制台应用程序的控制台输出中的文本显示为斜体的方法 微软文档很
  • 使用 ThreeCSG 出现意外结果

    我正在尝试 ThreeCSG 库 并尝试将球体或法线几何体替换为自定义形状 在本例中为 3js 示例中的心形 不幸的是 我在面向相机的一侧得到了奇怪的结果 这是一个代码示例 function onLoad var container cam
  • 带有嵌套列表的 ASP.NET MVC DefaultModelBinder

    我有一个视图 其中有一个代表员工时间表的表 顶部的天数 向下的项目 每个日期 项目交叉点都包含正常工作时间和加班时间的两个值 页面模型的 简化的 类定义是 public class TimesheetFormModel public Lis
  • 在给定迭代器的情况下使用 for-each 循环的惯用方法?

    当增强的 for 循环 foreach 循环 被添加到 Java 中时 它可以处理数组或数组的目标Iterable for T item T or Iterable