【问题标题】:Java loop expressions to print list用于打印列表的 Java 循环表达式
【发布时间】:2019-10-09 06:03:16
【问题描述】:

能否告诉我是否还有其他 Java 程序员必须能够阅读的循环表达式?

final List<String> names = Arrays.asList("Alice", "Bob", "Carol", "Dave", "Eve");

System.out.println("Pattern 1:");
for (int i = 0; i < names.size(); i++) {
    System.out.println(names.get(i));
}

System.out.println("Pattern 2:");
Iterator<String> iterator = names.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

System.out.println("Pattern 3:");
for (String name : names) {
    System.out.println(name);
}

System.out.println("Pattern 4:");
names.forEach(new Consumer<String>() {
    @Override
    public void accept(String name) {
        System.out.println(name);
    }
});

System.out.println("Pattern 5:");
names.forEach((String name) -> {System.out.println(name);});

System.out.println("Pattern 6:");
names.forEach((String name) -> System.out.println(name));

System.out.println("Pattern 7:");
names.forEach(name -> System.out.println(name));

System.out.println("Pattern 8:");
names.forEach(System.out::println);

System.out.println("Pattern 9:");
names.stream().forEach(System.out::println);

【问题讨论】:

  • 也试试递归。这可能会有所帮助:stackoverflow.com/questions/2044033/…
  • 模式5、6、7有什么区别?这只是语法糖。您只是在寻找模式吗?
  • @VinayPrajapati 认为 Java 程序员应该知道不同的语法糖,所以我将它们添加为不同的模式。
  • 好吧!请记住,当涉及到最佳编码实践和指南时,应该避免大多数这些语法糖,例如总是有一个带有花括号的 if 块。尽管如此,了解所有这些都很好。
  • 所有 5、6、7、8 都可以在有或没有stream() 的情况下使用(如 9)。

标签: java


【解决方案1】:

我们也有,

names.stream().forEachOrdered(System.out::println);

应该使用forEachOrdered 而不是forEach,因为forEach 的行为是不确定的,但是forEachOrdered 按照流中定义的顺序执行操作,前提是您在流

另外,你有parallelStream,它可以打印列表而不管顺序,

names.parallelStream().forEach(System.out::println);

您也可以这样做,在打印列表后删除第一个元素,您也可以对迭代器执行相同的操作,也可以使用iterator.previous 方法。

while(!names.empty()){
    SOP(names.get(0));
    names = names.subList(1,names.size());
}

【讨论】:

    【解决方案2】:

    更多可能性:

    System.out.println("Pattern 12:");
    IntStream.range(0, names.size())
            .mapToObj(i -> names.get(i))
            .forEach(System.out::println);
    
    System.out.println("Pattern 13:");
    Stream.generate(names.iterator()::next)
            .limit(names.size())
            .forEach(System.out::println);
    

    但是,与其简单地列出您能想到的所有循环模式,不如对它们进行分类并考虑每个循环模式的用例会更有用。首先,我建议以下类别:

    1. 索引循环,例如模式 1、12

      • 在需要索引时使用(显然)
      • 当您想要一次迭代多个循环时也很有用
      • 您还可以有其他终止条件
    2. 非索引的、可破坏的循环,例如模式 2、3

      • 当您不需要索引时,比索引循环更具可读性
      • 在需要其他终止条件时使用(例如,在列表中搜索特定值时)
    3. 非索引、不可破坏的循环,例如模式 4、9、13:

      • 在某些情况下可能是最易读的类型(但肯定不是全部)
      • 当您随时拥有 lambda 或方法引用并且不需要索引、不需要一起处理多个集合并且不需要提前中断时使用
      • 在 Java 11 中(确切地说,是从 Java 9 开始,但现在谁还在使用 Java 9),模式 9 和 13 属于使用新的 takeWhile 方法的可破坏类别。

    【讨论】:

    • 哇,我真的没想到。
    【解决方案3】:

    Java 11

    System.out.println("Pattern 11:");
    names.forEach((var name) -> System.out.println(name));
    

    【讨论】:

    • var...啊,我没想到。
    【解决方案4】:

    您可以在 for 循环中使用迭代器:

    for(Iterator<String> nameIterator = names.iterator(); nameIterator.hasNext(); ) {
        System.out.println(nameIterator.next());
    }
    

    【讨论】:

    • 不错。可以缩短模式2。
    猜你喜欢
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    相关资源
    最近更新 更多