Introducido en Java 8, Stream API se usa para procesar colecciones de objetos. Una secuencia es una secuencia de objetos que admite varios métodos que se pueden canalizar para producir el resultado deseado.
En este artículo, se analizan los métodos para convertir una secuencia en un mapa .
Método 1: Uso de la función Collectors.toMap()
El método Collectors.toMap() toma dos parámetros como entrada:
- KeyMapper: esta función se utiliza para extraer claves del mapa del valor de flujo.
- ValueMapper: esta función se utiliza para extraer los valores del mapa para la clave dada.
Los siguientes son ejemplos de la función toMap para convertir la secuencia dada en un mapa:
- Ejemplo 1: aquí convertiremos una string en un mapa con las claves como las palabras de la string y el valor como la longitud de cada palabra.
// Program to convert
// the Stream to Map
import
java.io.*;
import
java.util.stream.*;
import
java.util.Arrays;
import
java.util.Map;
class
GFG {
// Function to convert the string
// to the map
public
static
Map toMap(String input)
{
Map<String, Integer> lengthMap
= Arrays.stream(input.split(
" "
))
.collect(Collectors.toMap(
value
-> value,
value -> value.length()));
return
lengthMap;
}
public
static
void
main(String[] args)
{
String input =
"Geeks for Geek"
;
System.out.println(toMap(input));
}
}
Producción:{Geek=4, for=3, Geeks=5}
En el ejemplo anterior, el colector toMap toma dos funciones lambda como parámetros:
- (valor -> valor): Lee el valor del flujo actual y lo devuelve como la clave del Mapa.
- (valor -> valor.longitud): lee el valor de flujo actual, encuentra su longitud y devuelve el valor al Mapa para la clave dada.
- Ejemplo 2: Ahora, usemos la función toMap para realizar una conversión de mapas un poco más compleja. Aquí, convertiremos una lista de usuarios en un mapa donde UserId es la clave y User es el valor.
// Program to convert User[] into
// Map<userId, User>
import
java.util.Arrays;
import
java.util.Map;
import
java.util.stream.*;
// Implementing the User class
public
class
User {
// Attributes of the user class
private
int
userId;
private
String name;
private
String city;
// Constructor
public
User(
int
userId, String name,
String city)
{
this
.userId = userId;
this
.name = name;
this
.city = city;
}
// Getters of the user class
public
int
getUserId() {
return
userId; }
public
String getName() {
return
name; }
public
String getCity() {
return
city; }
// Overriding the toString method
// to return the custom string
@Override
public
String toString()
{
return
"User [userId = "
+ userId +
", name = "
+ name +
", city = "
+ city +
"]"
;
}
}
class
GFG {
// Function to convert the User
// to the map
public
static
Map toMap(User user1, User user2,
User user3)
{
Map<Integer, User> userMap
= Arrays.asList(user1, user2, user3)
.stream()
.collect(Collectors.toMap(
user
-> user.getUserId(),
user -> user));
return
userMap;
}
// Driver code
public
static
void
main(String[] args)
{
// Creating users
User user1
=
new
User(
1
,
"User1"
,
"Pune"
);
User user2
=
new
User(
2
,
"User2"
,
"Mumbai"
);
User user3
=
new
User(
3
,
"User3"
,
"Nagpur"
);
System.out.println(toMap(user1, user2,
user3));
}
}
Producción:{1=Usuario [Id. de usuario = 1, nombre = Usuario1, ciudad = Pune], 2=Usuario [Id. de usuario = 2, nombre = Usuario2, ciudad = Bombay], 3=Usuario [Id. de usuario = 3, nombre = Usuario3, ciudad = Nagpur ]}
Método 2: uso de recopiladores
El recopilador groupingBy toma una función como entrada y crea un grupo de objetos de flujo usando esa función. Los siguientes son ejemplos para convertir un flujo en un mapa usando groupingBy Collector.
- Ejemplo 1: en este ejemplo, convertiremos un flujo de usuarios en un mapa cuya clave es la ciudad y el valor son los usuarios que viven en esa ciudad.
// Java program to convert the User[]
// into Map<city, List<User>>
import
java.util.Arrays;
import
java.util.Map;
import
java.util.List;
import
java.util.stream.*;
// Implementing the User class
public
class
User {
// Parameters of the user class
private
int
userId;
private
String name;
private
String city;
// Constructor of the User class
public
User(
int
userId, String name,
String city)
{
this
.userId = userId;
this
.name = name;
this
.city = city;
}
// Getter functions
public
int
getUserId() {
return
userId; }
public
String getName() {
return
name; }
public
String getCity() {
return
city; }
// Overriding the toString() method
// to create a custom function
@Override
public
String toString()
{
return
"User [userId = "
+ userId +
", name = "
+ name +
", city = "
+ city +
"]"
;
}
}
class
GFG {
// Function to convert the user
// object to the map
public
static
Map toMap(User user1,
User user2,
User user3,
User user4,
User user5)
{
Map<String, List<User> >
cityUserListMap
= Arrays.asList(user1, user2, user3,
user4, user5)
.stream()
.collect(Collectors.groupingBy(
User::getCity));
return
cityUserListMap;
}
// Driver code
public
static
void
main(String[] args)
{
// Creating new users
User user1
=
new
User(
1
,
"User1"
,
"Pune"
);
User user2
=
new
User(
2
,
"User2"
,
"Mumbai"
);
User user3
=
new
User(
3
,
"User3"
,
"Nagpur"
);
User user4
=
new
User(
4
,
"User4"
,
"Pune"
);
User user5
=
new
User(
5
,
"User5"
,
"Mumbai"
);
System.out.println(toMap(user1, user2,
user3, user4,
user5));
}
}
Producción:{Nagpur=[Usuario [userId = 3, nombre = Usuario3, ciudad = Nagpur]], Pune=[Usuario [userId = 1, nombre = Usuario1, ciudad = Pune], Usuario [userId = 4, nombre = Usuario4, ciudad = Pune]], Mumbai=[Usuario [ID de usuario = 2, nombre = Usuario2, ciudad = Mumbai], Usuario [ID de usuario = 5, nombre = Usuario5, ciudad = Mumbai]]}
- Ejemplo 2: también podemos proporcionar un recopilador adicional a groupingBy si necesitamos información adicional además del objeto real. En este ejemplo, veremos cómo obtener el recuento de los usuarios que pertenecen a cada ciudad.
// Java program to convert User[]
// into Map<city, countOfUser>
import
java.util.Arrays;
import
java.util.Map;
import
java.util.stream.*;
// Implementing the user class
public
class
User {
// Parameters of the user class
private
int
userId;
private
String name;
private
String city;
// Constructor
public
User(
int
userId, String name,
String city)
{
this
.userId = userId;
this
.name = name;
this
.city = city;
}
// Getter functions
public
int
getUserId() {
return
userId; }
public
String getName() {
return
name; }
public
String getCity() {
return
city; }
// Overriding the toString() method
// to create a custom function
@Override
public
String toString()
{
return
"User [userId = "
+ userId +
", name = "
+ name +
", city = "
+ city +
"]"
;
}
}
class
GFG {
public
static
Map toMap(User user1,
User user2,
User user3,
User user4,
User user5)
{
Map<String, Long>
cityUserCountMap
= Arrays.asList(user1, user2, user3,
user4, user5)
.stream()
.collect(
Collectors.groupingBy(
User::getCity,
Collectors.counting()));
return
cityUserCountMap;
}
// Driver code
public
static
void
main(String[] args)
{
// Creating new users
User user1
=
new
User(
1
,
"User1"
,
"Pune"
);
User user2
=
new
User(
2
,
"User2"
,
"Mumbai"
);
User user3
=
new
User(
3
,
"User3"
,
"Nagpur"
);
User user4
=
new
User(
4
,
"User4"
,
"Pune"
);
User user5
=
new
User(
5
,
"User5"
,
"Mumbai"
);
System.out.println(toMap(user1, user2,
user3, user4,
user5));
}
}
Producción:{Nagpur=1, Pune=2, Mumbai=2}
Publicación traducida automáticamente
Artículo escrito por prasadanc1011 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA