如何在番石榴中迭代

时间:2011-07-27 10:31:40

标签: java 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());
    }
  }
}

4 个答案:

答案 0 :(得分:5)

即将推出的Guava版本10将使这种初始化变得更加痛苦:

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

(目前尚无第10版,但您可以下载资源并自行构建)

答案 1 :(得分:3)

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

我可以建议的唯一改进是使用generics,并使用enhanced for loop迭代列表而不是显式获取和使用迭代器:

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);
  }

}

答案 2 :(得分:3)

正如@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));
}

我在这里使用的两个番石榴事物是immutable listsjoiner

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

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

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

答案 3 :(得分:2)

在这种特定情况下,不需要使用列表 - 正如@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);
 }

修改

有一篇很好的博客文章here来自Fest Assertions的创建者关于为什么不编程为Iterable(小猫的死亡等等)。我仍然没有完全相信它在所有情况下的邪恶,但我可以承认,在某些情况下,对于使用代码的人来说这是非常苛刻的 - 特别是在API设计的情况下。