Utilizzare raccolte Google. Esempio:
Function<ViewValue, Long> transform = new Function<ViewValue, Long>() {
@Override
public Long apply(ViewValue from) {
return from.getId();
}
};
List<ViewValue> list = Lists.newArrayList();
List<Long> idsList = Lists.transform(list, transform);
UPDATE:
su Java 8 non occorre Guava. È possibile:
import com.example.ViewValue;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
Function<ViewValue, Long> transform = ViewValue::getId;
List<ViewValue> source = new ArrayList<>();
List<Long> result = source.stream().map(transform).collect(Collectors.toList());
O semplicemente:
List<ViewValue> source= new ArrayList<>();
List<Long> result = source.stream().map(ViewValue::getId).collect(Collectors.toList());
prossimo aggiornamento (l'ultima dopo Javaslang al cambio di nome Vavr):
Attualmente vale la pena di menzionare circa la soluzione con
Biblioteca Javaslang (
http://www.javaslang.io/)
Libreria Vavr (http://www.vavr.io/). Supponiamo che abbiamo la nostra lista con gli oggetti originali:
List<ViewValue> source = newArrayList(new ViewValue(1), new ViewValue(2), new ViewValue(2));
potremmo fare trasformazione con classe List dalla biblioteca Javaslang (sul lungo periodo la raccolta non è conveniente):
List<Long> result = io.vavr.collection.List.ofAll(source).map(ViewValue::getId).toJavaList();
Ma si vuole vedere la potenza con solo le liste Javaslang:
io.vavr.collection.List<ViewValue> source = javaslang.collection.List.of(new ViewValue(1), new ViewValue(2), new ViewValue(3));
io.vavr.collection.List<Long> res = source.map(ViewValue::getId);
incoraggio a dare un'occhiata collezioni disponibili e nuovi tipi su quella libreria (mi piace soprattutto il tipo di prova). La documentazione è disponibile al seguente indirizzo:
http://www.javaslang.io/javaslang-docs/
http://www.vavr.io/vavr-docs/.
PS. A causa dell'Oracolo e della parola "Java" all'interno del nome, dovevano cambiare il nome della libreria da javaslang a qualcos'altro. Avevano deciso di Vavr.
soluzione Molto Javaesque - ma non in senso buono. Non riduce esattamente la quantità o la complessità del codice, vero? –
Direi che è più LINQ-esque che Java-esque personalmente. Preferisco creare il codice di conversione e quindi isolare l'aspetto di proiezione, ma se preferisci duplicare la logica di conversione di volte, va bene. Sarebbe molto più carino con le espressioni lambda, ovviamente. –
Non è qualcosa che facciamo con Comparator in Java? –