【问题标题】:How do I implement Ruby's ".each" method in Java?如何在 Java 中实现 Ruby 的“.each”方法?
【发布时间】:2012-01-23 07:20:11
【问题描述】:

我是 Java 新手,想知道如何实现像 Ruby 的 .each 这样的方法,以便更轻松地迭代数组和列表等类?

【问题讨论】:

  • 有许多实现,但由于需要创建接口实现,它们都很庞大。在 Java 8 关闭之前,您应该评估它们是否真的是您想要的。如果您编写大量具体的函子,它们就会有意义。

标签: java ruby loops for-loop each


【解决方案1】:

【讨论】:

    【解决方案2】:

    虽然在标准 Java 中实现它确实有点尴尬,但一些流行的库(您甚至可能已经在使用)提供了一个 Predicate 接口,至少可以为您节省大量的编写工作.最棒的是,它们还提供经过彻底测试、经过验证的帮助程序类,这意味着您不必编写迭代代码

    查看 Google Guava 的 Iterables 类 - 您可以执行 filter()findIf()removeIf() 之类的操作。如果使用得当,这些方法可以得到非常易读的结果。

    Apache 的 Commons Collections 在CollectionUtils 中提供了类似的东西。 find()filter()select() 等方法都采用 Predicate

    Google Guava 还更进一步,为您提供了 Predicates 助手,它有一个 whole load 的罐装 Predicate 实例 - 例如 isNullcontainsPatternisInstanceOf

    如果您想避免为这些东西重新发明轮子,请查看它们。

    【讨论】:

      【解决方案3】:

      由于缺少闭包,它变得丑陋,直到 Java 8,但这里是:

      import java.util.Arrays;
      import java.util.Collection;
      import java.util.List;
      
      
      public class EachTest {
      
          interface ItemProcessor<T>{
              void process(T item);
          }
      
           static <T> void each(Collection<T> collection, ItemProcessor<T> processor){
              for (T item: collection){
                  processor.process(item);
              }
          }
      
          public static void main(String[] args) {
              List<String> list=Arrays.asList(new String("foo"),"bar");
      
              EachTest.<String>each(list,new ItemProcessor<String>() {
                  @Override
                  public void process(String item) {
                      System.out.println(item);
                  }
              });
          }
      
      }
      

      我认为在 Java 8 中,它会是(但不要引用我的话):

      public static void main(String[] args) {
          List<String> list=Arrays.asList(new String("foo"),"bar");
          EachTest.<String>each(list,String item=>System.out.println(item));
      }
      

      【讨论】:

      • 我认为上周应该是-&gt; 而不是=&gt;
      【解决方案4】:

      您不能像 Ruby 那样创建 each 函数,因为 Java 不像 Ruby 那样接受块作为参数。您可以使用接口并提供匿名类定义,但这比仅对每个构造使用 Java 更复杂。要在 Java 中为每个,您可以执行以下操作:

      String[] myStrings = { "a", "b", "c" };
      
      for (String str : myStrings) {
          // Do something with each String value.
          System.out.println(str);
      }
      

      【讨论】:

      • 好的。我有一种预感,这可能是不可能的。我真的想避免必须为 for 循环编写完整的语法。
      • 老实说,样板代码并没有太大;唯一的区别(就详细程度而言)是您必须指定类型。
      • 是的,你是对的。只是写 java Everything 的东西似乎要冗长得多。我选择这个作为正确答案,因为这是最明智的做法。感谢您的回答。
      【解决方案5】:

      您可以使用Iterator 来完成,也可以使用特殊版本的 for:

      ArrayList<String> strings = ...;
      
      for (String str : strings) {
          System.out.println(str);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-11
        • 1970-01-01
        • 2018-08-03
        • 1970-01-01
        • 2018-02-14
        • 2020-07-15
        • 2014-02-06
        • 1970-01-01
        相关资源
        最近更新 更多