繁体   English   中英

如何在番石榴中迭代

[英]How to iterate in Guava

我正在努力学习番石榴。 但是我不是很成功,因为教程很少。

任何人都可以告诉我如何在Guava中编写这段代码。

import java.util.*;

public class list {
  public static void main(String[] args) {
    List l = new ArrayList();
    for (int i = 1; i < 6; i++) {
      l.add(i);
    }
    Iterator it = l.iterator();
    while (it.hasNext()) {
      System.out.println(it.next());
    }
  }
}

即将推出的Guava版本10将使这种初始化更加轻松:

List<Integer> l = Lists.newArrayList(
        Ranges.closed(1, 5).asSet(DiscreteDomains.integers())
);
for (Integer item : l) {
    System.out.println(item);
}

(目前还没有版本10,但您可以下载源代码并自行构建)

Guava(据我所知)并没有提供任何功能来简化您发布的代码。

我可以建议的唯一改进是使用泛型 ,并使用增强的for循环迭代列表而不是显式获取和使用迭代器:

import java.util.*;

public class list {
  public static void main(String[] args) {
  List<Integer> l = new ArrayList<Integer>();
  for (int i = 1; i < 6; i++) {
    l.add(i);
  }

  for(Integer i : l) {
    System.out.println(i);
  }

}

正如@Jared Russell指出的那样,这并不是表明Guava如何帮助您在代码中做出改进的最佳标本。

也就是说,如果您只是想要了解Guava如何在这段代码中找到方法,那么这里有一个镜头:

import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableList.Builder;

public class Question6842887 {
public static void main(String[] args) {
    Builder<Integer> builder = ImmutableList.builder();
    for (int i = 1; i < 6; i++) {
        builder.add(i);
    }

    ImmutableList<Integer> list = builder.build();

    System.out.println(Joiner.on(System.getProperty("line.separator")).join(list));
}

我在这里使用的两个番石榴的东西是不可变的列表木匠

这可能不是你通常需要一个ImmutableList的情况,但是不管怎样都习惯使用它是一种好习惯。 不可变集合(以及任何不可变对象)的巨大优势在于它们是线程安全的。 您永远不需要制作防御性副本或者在传递内容后担心内容会发生变化。 你可以简单地自由传递它,或者缓存它,并且对它的不变性感到高兴和安全。 有关不变性主题的更多信息,我将向您介绍Effective Java ,第15项。

我在这里展示的另一个番石榴课是乔纳。 Joiner只是一种用分隔符将字符串集合在一起的简单方法。 它是相当可定制的,您可以指定它将如何处理空值以及您想要使用的分隔符。 在这种情况下,我已将System.getProperty("line.separator")指定为我的分隔符; 你可以选择使用", "或类似的。 我也选择不处理空值,因为我知道我们的ImmutableList中没有空值。 但是,如果列表可以包含空值,则可以选择skipNullsuseForNull这样的选项。

下一版Guava预计将包括Range支持。 这可用于简化列表构建,如ContiguousSet<Integer> list = Ranges.closedOpen(1, 6).asSet(DiscreteDomains.integers()); 虽然我不推荐它,但你的整个程序可能只有一行。

在这种特定情况下,不需要使用列表 - 正如@Sean Patrick Floyd通过使用范围所示 - 您正在迭代的集合是一组数字 - 所以列表实际上不是最好使用的类型。

使用guava增强了我“将程序编程为最通用类型”的决心 - 我发现自己越来越多地编程为Iterable - 之前由于某种原因,我会认为Collection是这类用例中最抽象的类型。

Guava的Iterables类对于处理Iterable类型非常有用,我认为它确实可以带来更好的代码。

使用我当前版本的guava(12.0) - 一种干净的写作方式:

 Iterable<Integer> l = Ranges.closed(1, 5).asSet(DiscreteDomains.integers());
 for (Integer item : l) {
    System.out.println(item);
 }

编辑

这是一个很好的博客文章在这里从一个巨星的断言为什么不来划去了Iterable创建者(小猫的死...等等)。 我仍然没有完全相信它在所有情况下的邪恶,但我可以承认,在某些情况下,对于使用代码的人来说这是非常苛刻的 - 特别是在API设计的情况下。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM