【问题标题】:Foreach loop in java for a custom object listjava中的foreach循环用于自定义对象列表
【发布时间】:2012-11-11 07:35:20
【问题描述】:

我有一个 Room 类型的 ArrayList(我的自定义对象),定义如下

ArrayList<Room> rooms = new ArrayList<Room>();

在向 ArrayList 添加一系列对象之后,我想遍历它们并检查各种事情。我不是 java 的热心用户,但我知道在许多其他编程语言中,foreach 循环将是执行此操作的最简单方法。

经过一番研究,我发现了以下链接,它建议了下面的代码。 How does the Java 'for each' loop work?

for(Iterator<String> i = someList.iterator(); i.hasNext(); ) {
  String item = i.next();
  System.out.println(item);
}

但据我所知,这不能用于自定义对象的 Arraylist。

可以,如果可以,如何为自定义对象的 ArrayList 实现 foreach 循环? 或者我该如何处理每个项目?

【问题讨论】:

标签: java foreach arraylist


【解决方案1】:

其实enhanced for loop应该是这样的

for (final Room room : rooms) {
          // Here your room is available
}

【讨论】:

  • 在上面的代码中,'final' 是干什么用的?下面的例子好像没有这个。
  • 使用 final 关键字被认为是一个好习惯,只要您使用一个包含常量值的变量或不应更改的引用(如您的情况)。在这个for 循环中,它可以防止其中的代码意外地将不同的Room 分配给room 局部变量。
  • @ShyJ 虽然它并没有真正添加任何东西。分配房间并不会造成任何伤害,而将房间设为 final 并不能防止通过改变房间可能造成的任何伤害。
  • @Cubic 好吧,如果没有 final,你实际上可以在循环体中有一个 room = new Room () 语句并在一个完全不同的房间上运行。
【解决方案2】:

使用也可以使用 Java 8 流 API 并在一行中做同样的事情。

如果您想打印任何特定属性,请使用以下语法:

ArrayList<Room> rooms = new ArrayList<>();
rooms.forEach(room -> System.out.println(room.getName()));

ArrayList<Room> rooms = new ArrayList<>();
rooms.forEach(room -> {
    // here room is available
});

如果你想打印 Java 对象的所有属性,那么使用这个:

ArrayList<Room> rooms = new ArrayList<>();
rooms.forEach(System.out::println);

【讨论】:

    【解决方案3】:
    for(Room room : rooms) {
      //room contains an element of rooms
    }
    

    【讨论】:

    • 此示例与其他答案中包含“final”一词的代码有什么区别?
    • 如果一个变量是final的,这意味着你可以t change its的值。
    • 这样在迭代时你不能更新它的值。
    【解决方案4】:

    您可以通过更改类的参数化来使用迭代器模式修复您的示例:

    List<Room> rooms = new ArrayList<Room>();
    rooms.add(room1);
    rooms.add(room2);
    for(Iterator<Room> i = rooms.iterator(); i.hasNext(); ) {
      String item = i.next();
      System.out.println(item);
    }
    

    或者更简单的方法:

    List<Room> rooms = new ArrayList<Room>();
    rooms.add(room1);
    rooms.add(room2);
    for(Room room : rooms) {
      System.out.println(room);
    }
    

    【讨论】:

      【解决方案5】:

      如果这段代码没有对列表中的每一项进行操作,那一定是因为在你完成列表之前有东西抛出了异常;最可能的候选方法是称为“insertOrThrow”的方法。您可以将该调用包装在一个 try-catch 结构中,以处理任何失败的项目的异常,而不会过早退出循环和方法。

      【讨论】:

        猜你喜欢
        • 2017-03-02
        • 1970-01-01
        • 1970-01-01
        • 2015-05-06
        • 2017-11-09
        • 2021-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多