如果我有FluentIterable
,如何在索引FluentIterable
没有元素的情况下获得新的i
?
答案 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);
}
}