2017-07-06 2 views

Répondre

3

Il n'y a rien de prévu pour cela, et pas de mise en œuvre particulièrement réussie non plus.

Je vous recommande honnêtement d'utiliser une liste modifiable et d'appeler remove(int index). Les chaînes d'affichage fluides ne semblent pas susceptibles d'être efficaces pour ce type de cas d'utilisation.

0

est ici un moyen de le faire sans listes mutables:

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

Et voici une façon un peu plus performant:

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

Notez que #subList est soutenu par le ImmutableList original, donc nous n'itérer par myIterable une fois ici.

+0

Notez que vous _can, _ mais il ne va pas être très efficace, surtout si vous faites ceci plus d'une fois. –

+0

Correct, il passera par l'itérable deux fois au lieu d'une fois. Je me demande s'il y a une fonction de filtre intégrée qui donne la valeur et l'index comme une paire. Ensuite, vous pouvez filtrer par index. –

+0

vous pourriez être en mesure de le retirer avec des flux avec 'Streams.mapWithIndex', mais si vous avez besoin de choses comme ça, vous serez vraiment mieux avec quelque chose de mutable. –

0

Vous pouvez le faire en appliquant une transformation pour associer chaque élément à son index, puis filtrer l'élément avec l'index que vous ne voulez pas, et enfin transformer chaque élément avec son index en seulement l'élément. par exemple:

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); 
    } 
}