Cómo convertir un flujo en un mapa en Java

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:

  1. KeyMapper: esta función se utiliza para extraer claves del mapa del valor de flujo.
  2. 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:

    1. (valor -> valor): Lee el valor del flujo actual y lo devuelve como la clave del Mapa.
    2. (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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *