我经常需要从第二个元素开始遍历List。 例如,这是一列:
List<String> column = Arrays.asList("HEADER", "value1", "value2", "value3");
我只需要打印值。
我看到三种方法:
使用子列表:
for (String s : column.subList(1, column.size())) {
System.out.println(s);
}
使用ListIterator
for (ListIterator<String> iter = column.listIterator(1); iter.hasNext(); ) {
System.out.println(iter.next());
}
使用索引
for (int i = 1; i < column.size(); i++) {
System.out.println(column.get(i));
}
考虑可读性,最佳实践和性能,最优选的是什么?
在我看来,子列表解决方案更具可读性,但我很少在实践中看到它。 与索引解决方案相比,它是否存在任何重大缺陷?
答案 0 :(得分:3)
如果您使用Java 8或更高版本,则可以使用:
column.stream().skip(1).forEach((c) -> System.out.println(c))
答案 1 :(得分:2)
这真的归结为(几乎)“个人风格”。
您应该选择最适合您/您的团队的方法。
选项3 似乎是带有最少开销的选项 - 选项1和2都创建新的“中间”对象(子列表和迭代器)。而且确切地说:sublist()
不创建新列表并填充它 - 它归结为一个新的Sublist
对象,它只是“知道”较大父列表中的边界。
但是:只要我们考虑不支持列表元素随机访问的列表(例如想想链接列表),那么选项3会产生很多性能成本与其他成本相比。
答案 2 :(得分:1)
这更多是个人喜好的问题。 sublist
方法不返回新对象,只返回当前列表顶部的视图,因此它没有任何内存开销。我认为可读性是决定这一点的唯一标准,最后一个选项是最易读的解决方案,不需要调用任何额外的方法(例如迭代器,子列表等)