迭代除第一个元素之外的 List 的首选方法

Evg*_*nov 10 java iteration collections

我经常需要从第二个元素开始遍历 List。例如这里是一列:

List<String> column = Arrays.asList("HEADER", "value1", "value2", "value3");
Run Code Online (Sandbox Code Playgroud)

我只需要打印值。

我看到三种方法:

  1. 使用子列表:

    for (String s : column.subList(1, column.size())) {
        System.out.println(s);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用 ListIterator

    for (ListIterator<String> iter = column.listIterator(1); iter.hasNext(); ) {
        System.out.println(iter.next());
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用索引

    for (int i = 1; i < column.size(); i++) {
        System.out.println(column.get(i));
    }
    
    Run Code Online (Sandbox Code Playgroud)

考虑到可读性、最佳实践和性能,最受青睐的是什么?

在我看来 sublist 解决方案更具可读性,但我在实践中很少看到它。与索引解决方案相比,它是否有任何明显的不足?

sen*_*vic 7

如果您使用 Java 8 或更高版本,则可以使用:

column.stream().skip(1).forEach((c) -> System.out.println(c))
Run Code Online (Sandbox Code Playgroud)

  • 如果您关心顺序,请务必使用“forEachOrdered” (2认同)

Gho*_*ica 5

这真的归结为(几乎)“个人风格”而已。

您应该简单地选择最适合您/您的团队的方法。

选项 3似乎是开销最少的选项 - 选项 1 和 2 都创建新的“中间”对象(子列表分别是迭代器)。准确地说:sublist()不会创建一个新列表并填充它 - 它归结为一个新列表Sublist对象,它只是“知道”更大的父列表中的边界。

但是:一旦我们考虑支持随机访问列表元素的列表(例如链接列表),那么与其他选项相比,选项 3 会导致大量的性能成本。