2017-10-12 7 views
1

J'ai une méthode de mappeur qui accepte une fonction lambda de l'objet qui l'appelle.Java itérer à l'aide d'une méthode de mappage à l'aide de lambdas?

LambdaList<String> strings = new LambdaList<String>("May", 
"the", "force", "be", "with", "you"); 
list = strings.map(x -> x.length()); 
assert list.equals(new LambdaList<Integer>(3, 3, 5, 2, 4, 3)) 
    : "map() failed. Result is " + list + "."; 

La méthode carte sera alors itérer que la liste et retourner une nouvelle liste une fois que le lambda a été appliquée.

/** 
    * Returns a list consisting of the results of applying the given function 
    * to the elements of this list. 
    * @param <R> The type of elements returned. 
    * @param mapper The function to apply to each element. 
    * @return The new list. 
    */ 
    public <R> LambdaList<R> map(Function<? super T, ? extends R> mapper) { 
    ArrayList<R> newList = new ArrayList<>(); 
    for(T item: this){ 
     newList.add(mapper.apply(item));  
    } 
    return new LambdaList<R>(newList); 
    } 

La liste lambda est définie comme ci-dessous:

class LambdaList<T> { 
    private ArrayList<T> list; 

    public LambdaList() { 
    list = new ArrayList<T>(); 
    } 


    @SafeVarargs 
    public LambdaList(T... varargs) { 
    list = new ArrayList<T>(); 
    for (T e: varargs) { 
     list.add(e); 
    } 
    } 

    private LambdaList(ArrayList<T> list) { 
    this.list = list; 
    } 

    public LambdaList<T> add(T e) { 
    ArrayList<T> newList = new ArrayList<>(); 
    newList.addAll(list); 
    newList.add(e); 
    return new LambdaList<T>(newList); 
    } 

J'ai essayé d'utiliser T item: this pour faire référence à l'objet lui-même, mais cela ne fonctionne pas. Comment ferais-je pour implémenter cette méthode?

+0

Comment avez-vous défini 'LambdaList'? Quelles sont les interfaces et la superclasse? –

+0

Quel est le raisonnement derrière la méthode 'add'? Pourquoi ne pas simplement 'list.add (e); retourne ceci; – Marvin

+1

@Marvin On dirait que c'est censé être une collection immuable. –

Répondre

1

Pour pouvoir écrire une boucle for améliorée, l'objet doit être itérable.

class LambdaList<T> implements Iterable<T> { ... } 

Vous aurez alors besoin de mettre en œuvre une méthode public Iterator<T> iterator(), qui ressemblera probablement return internalList.iterator();.

+1

Notez que l'utilisation de l'itérateur de la liste interne ouvre un moyen de contourner l'immutabilité de la liste via 'Iterator.remove()'. –

+0

@MikeStrobel bon point – assylias

+0

Existe-t-il une alternative à l'utilisation d'un itérateur? – Carrein