2017-07-06 2 views

答えて

3

これには何も組み込まれておらず、特に大きな実装もありません。

変更可能なリストを使用してremove(int index)を呼び出すことを正直にお勧めします。流暢なビューチェーンは実際にこの種のユースケースには有効ではないようです。ここで

0

は、変更可能なリストなしでそれを行う方法です:

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

#subListが元ImmutableListによって支えられていることを注意ので、我々は唯一の反復:

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

そしてここでは、わずかによりパフォーマンスの方法ですここではmyIterableまでです。

+0

注_can、_あなたが行う場合は特に、非常に効率的であることを行っていませんこれは複数回です。 –

+0

修正すると、iterableを1回ではなく2回実行します。私は値とインデックスをペアとして与える組み込みのフィルタ関数があるのだろうかと思います。その後、インデックスでフィルタリングすることができます。 –

+0

あなたはStreams.mapWithIndex' 'とストリームとそれをやってのけることができるかもしれないが、あなたはこのようなものが必要な場合は、_really_可変何かを持つ方が良いことになるだろう。 –

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); 
    } 
} 
関連する問題