2017-07-06 63 views

回答

3

這裏沒有內置任何東西,也沒有特別好的實現。

我老老實實建議使用一個可變的列表和調用remove(int index)。流暢的視圖鏈對於這種用例似乎不太可能有效。

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曾經在這裏。

+0

注意你_can,_但它不會是非常有效的,特別是如果你做這不止一次。 –

+0

正確的話,它會經歷迭代兩次而不是一次。我想知道是否有一個內置的過濾器函數可以將值和索引作爲一對。然後你可以通過索引進行過濾。 –

+0

你可能可以通過'Streams.mapWithIndex'將數據流關閉,但如果你需要這樣的事情,你真的會變得更好。 –

0

您可以通過應用轉換到其索引中的每個元素相關聯,然後過濾掉你不想要索引的元素,最後用它的索引變換的每個元素回到剛纔的元素做到這一點。例如:

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); 
    } 
} 
相關問題