Con java-8, podrás hacer esto en una línea usando streams y la Collectors
clase.
Map<String, Item> map =
list.stream().collect(Collectors.toMap(Item::getKey, item -> item));
Demo breve:
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Test{
public static void main (String [] args){
List<Item> list = IntStream.rangeClosed(1, 4)
.mapToObj(Item::new)
.collect(Collectors.toList()); //[Item [i=1], Item [i=2], Item [i=3], Item [i=4]]
Map<String, Item> map =
list.stream().collect(Collectors.toMap(Item::getKey, item -> item));
map.forEach((k, v) -> System.out.println(k + " => " + v));
}
}
class Item {
private final int i;
public Item(int i){
this.i = i;
}
public String getKey(){
return "Key-"+i;
}
@Override
public String toString() {
return "Item [i=" + i + "]";
}
}
Salida:
Key-1 => Item [i=1]
Key-2 => Item [i=2]
Key-3 => Item [i=3]
Key-4 => Item [i=4]
Como se señaló en los comentarios, puede usar en Function.identity()
lugar de item -> item
, aunque me parece i -> i
bastante explícito.
Y para ser completo, tenga en cuenta que puede usar un operador binario si su función no es biyectiva. Por ejemplo, consideremos esto List
y la función de mapeo que para un valor int, calcule el resultado del módulo 3:
List<Integer> intList = Arrays.asList(1, 2, 3, 4, 5, 6);
Map<String, Integer> map =
intList.stream().collect(toMap(i -> String.valueOf(i % 3), i -> i));
Al ejecutar este código, recibirá un error que dice java.lang.IllegalStateException: Duplicate key 1
. Esto se debe a que 1% 3 es igual a 4% 3 y, por lo tanto, tiene el mismo valor de clave dada la función de asignación de teclas. En este caso, puede proporcionar un operador de fusión.
Aquí hay uno que suma los valores; (i1, i2) -> i1 + i2;
eso se puede reemplazar con la referencia del método Integer::sum
.
Map<String, Integer> map =
intList.stream().collect(toMap(i -> String.valueOf(i % 3),
i -> i,
Integer::sum));
que ahora produce:
0 => 9 (i.e 3 + 6)
1 => 5 (i.e 1 + 4)
2 => 7 (i.e 2 + 5)
¡Espero eso ayude! :)