使用Guava中的FluentIterables为集合中的每个元素添加索引号

时间:2014-03-18 13:02:40

标签: java guava

我有一个String元素列表,我希望使用FluentIterables.transform进行转换。为了这个例子,我们说它是:

List<String> l = Arrays.asList("a", "b", "c");

现在我想为每个元素添加索引号,结果如下:

"0a", "1b", "2c"

有没有办法用Guava很好地完成这个?

2 个答案:

答案 0 :(得分:5)

FluentIterable.from(list).transform(new Function<String, String>(){
    private int ct = 0;
    @Override
    public String apply(String input){
        return ct++ + input;
    }

})

虽然这很容易,但我不一定称它为“好”,因为它是一个有状态函数,而函数通常应该是无状态的。但它运作良好。

答案 1 :(得分:3)

如果从 indices 而不是list元素开始,则可以使用无状态转换函数执行此操作。这是Java 8流的一个例子:

List<String> list = Arrays.asList("a", "b", "c");
IntStream.range(0, list.size())
    .mapToObj(i -> i + list.get(i))
    .forEachOrdered(System.out::println); //or .collect(Collectors.toList()), ...

您可以使用合适的索引生成器(例如ContiguousSet.create(Range.closedOpen(0, list.size()), DiscreteDomain.integers()))对FluentIterable执行相同的操作。