Freitag, 12. April 2013

Java: Listen transformieren

Braucht man eine Liste vom Typ X und hat eine Liste vom Typ Y, müssen alle Werte der Liste X transformiert werden. Das kopieren und transformieren aller Werte der Liste X verbietet sich ab da, wo die Liste X sehr viele Einträge hat und vielleicht nicht einmal alle Einträge gelesen werden. Für diesen Fall ist eine elegante Lösung die, einfach eine Liste vom Zieltyp Y zu erzeugen, die die Werte aus Liste X während dessen Abfrage transformiert. So eine Liste könnte wie folgt aussehen:

import java.util.AbstractList;
import java.util.List;

/**
 * List that allows to transform it values.
 * 
 * @param <T> The target, transformed type.
 * @param <S> The source type.
 */
public abstract class TransformValueList<S, T> extends AbstractList<T> {

    List<S> list;
    
    public TransformValueList(List<S> sourceValuesList) {
        this.list = sourceValuesList;
    }
    
    public abstract T transform(S source);
    
    @Override
    public T get(int index) {
        S source = list.get(index);
        return transform(source);
    }

    @Override
    public int size() {
        return list.size();
    }

}


Der praktische Einsatz der Liste, hier mit einer Transformation von einer List<Boolean> in eine List<String>.

List<String> stringList = new TransformValueList<Boolean, String>(listWithBoolean) {

    @Override
    public String transform(Boolean source) {
        return source != null ? source.toString() : "false";
    }
    
};
Die Werte der Liste werden während der Abfrage / Iteration transformiert. Wenn die Transformation komplexer ausfällt und die Liste mehrfach abgefragt wird, sollten die Werte aus Performancegründen gecacht werden.

Keine Kommentare:

Kommentar veröffentlichen