Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

287
Vistas
El orden de LinkedHashMap entrySet no se conserva en una transmisión (Android)

Estoy creando una utilidad de validación de formulario muy simple para una pantalla de registro, y me encuentro con un comportamiento inesperado relacionado con LinkedHashMap y una secuencia creada a partir de su entrySet .

Estoy almacenando resultados de validación en un LinkedHashMap , con el siguiente orden de declaraciones:

 Map<ValidationResult.SignUpField, Boolean> fieldStatuses = new LinkedHashMap<>(); fieldStatuses.put(EMAIL, isValidEmail(emailAddress)); fieldStatuses.put(USERNAME, isValidUsername(username)); fieldStatuses.put(BIRTHDAY, isValidBirthday(birthday)); fieldStatuses.put(PASSWORD, isValidPassword(password)); fieldStatuses.put(CONFIRM_PASSWORD, password.equals(confirmedPassword)); List<ValidationEntry> invalidFields = aggregateInvalidFields(fieldStatuses);

Una iteración en particular produce que todos los campos anteriores no sean válidos, excepto "confirmar contraseña". Usando un bucle for simple sobre el conjunto de entradas y omitiendo los resultados válidos, los resultados no válidos aparecen en el siguiente orden:

  • Correo electrónico
  • Nombre de usuario
  • Cumpleaños
  • Clave

Luego intenté hacer uso del subconjunto de Stream API disponibles en Android (apuntando a la versión 25 con un mínimo de 19, de ahí la falta de Collectors.toMap() ):

 private static List<ValidationEntry> aggregateInvalidFields(Map<ValidationResult.SignUpField, Boolean> fields) { List<ValidationEntry> invalidFields = new ArrayList<>(); fields.entrySet() .stream() .filter(entry -> !entry.getValue()) .forEachOrdered(entry -> { ValidationResult.SignUpField field = entry.getKey(); invalidFields.add(new ValidationEntry(field, lookUpErrorCode(field))); }); return invalidFields; }

Pero ese código produce el siguiente orden:

  • Cumpleaños
  • Clave
  • Nombre de usuario
  • Correo electrónico

¿Qué está sucediendo exactamente aquí? ¿Por qué el resultado de la transmisión no respeta el orden de inserción de LinkedHashMap ? Tenga en cuenta que si cambio forEachOrdered con forEach , todavía no está ordenado por inserción.

about 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Este comportamiento es un error conocido en la implementación de Android 7.0/7.1 de LinkedHashMap.

Los divisores de vistas de colección de LinkedHashMap para entrySet , values y keySet informan correctamente que están ORDERED , pero en realidad no lo están porque la implementación del divisor de la clase principal (HashMap) se usa internamente.

Este comportamiento ya se ha documentado en el Javadoc y allí también se proponen soluciones alternativas.

La solución se comprometió el 16 de agosto de 2016 y aparecerá en la próxima versión de Android.

Para aclarar: Google se dio cuenta de este error al principio en 2017-01, por lo que la "corrección" mencionada anteriormente fue una solución accidental. Si hubieran conocido este problema antes, la resolución se habría incluido en 7.1

about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda