在Guava中没有元素的Iterable

时间:2017-07-06 20:50:43

标签: java guava

如果我有FluentIterable,如何在索引FluentIterable没有元素的情况下获得新的i

3 个答案:

答案 0 :(得分:3)

没有内置任何内容,也没有特别好的实现。

我诚实地建议使用可变列表并调用remove(int index)。对于这种用例,流畅的视图链似乎不太有效。

答案 1 :(得分:0)

这是一种没有可变列表的方法:

FluentIterable.concat(myIterable.limit(i), myIterable.skip(i + 1));

这是一种稍微高效的方式:

ImmutableList<String> list = ImmutableList.copyOf(myIterable);
FluentIterable.concat(
    list.subList(0, i - 1),
    list.subList(i + 1, list.size() - 1));

请注意#subList由原始ImmutableList支持,因此我们只在此处迭代myIterable

答案 2 :(得分:0)

您可以通过应用转换将每个元素与其索引相关联,然后使用您不想要的索引过滤掉元素,最后将每个元素及其索引转换回元素。 e.g:

fluentIterable
        .transform(new WithIndexTransformer<>())
        .filter(indexedValue -> indexedValue.getIndex() != i)
        .transform(IndexedValue::getValue);

<强> IndexedValue.java

public class IndexedValue<T> {
    private final int index;
    private final T value;

    IndexedValue(int index, T value) {
        this.index = index;
        this.value = value;
    }

    public int getIndex() {
        return index;
    }

    public T getValue() {
        return value;
    }
}

<强> WithIndexTransformer.java

public class WithIndexTransformer<T> implements Function<T, IndexedValue<T>> {
    private int index = 0;

    @Override
    public IndexedValue<T> apply(T input) {
        return new IndexedValue<>(index++, input);
    }
}