es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Eliminar entrada duplicada utilizando stream

Tengo una lista de elementos y quiero eliminar los valores duplicados de ella.

Este es el dato de la lista que tengo. Aquí se duplica “FIN_NT”.

private Set<categorydata> getSetObject(List<><string>> list, String key, final int codePosition, final int nameposition){
    Function<><string>,CategoryData> convertListToMap = (l) -> {

        CategoryData obj = new CategoryData();
        obj.setCode(l.get(codePosition));
        obj.setName(l.get(nameposition));
        return obj;
    };
    Set<categorydata> distinct = list.stream().filter(this.contain(key)).map(convertListToMap).distinct().collect(Collectors.toSet());

    Set<categorydata> collect = list.stream().filter(this.contain(key)).map(convertListToMap).collect(Collectors.toSet());

    return list.stream().filter(this.contain(key)).map(convertListToMap).collect(Collectors.toSet());
}

Este es mi código. Necesito el resultado en este formato, sin ninguna entrada duplicada.

json
"finish": [
{
"code": "FIN_G",
"name": "Gloss"
},
{
"code": "FIN_NT",
"name": "Natural"
},
{
"code": "FIN_SX",
"name": "Silk"
}
]

Tags:  

Answer

  1. Avatar for davy.ai

    Para eliminar los valores duplicados de la lista, podemos utilizar el método distinct() después de mapear la lista a un conjunto (Set) de objetos CategoryData. Aquí está el código modificado:

    private List<categorydata> removeDuplicates(List<><string>> list, String key, final int codePosition, final int nameposition) {
        Function<><string>, CategoryData> convertListToObject = (l) -> {
            CategoryData obj = new CategoryData();
            obj.setCode(l.get(codePosition));
            obj.setName(l.get(nameposition));
            return obj;
        };
    
        List<categorydata> result = list.stream()
                .filter(this.contain(key))
                .map(convertListToObject)
                .distinct()
                .collect(Collectors.toList());
    
        return result;
    }
    

    El método distinct() asegura que solo se incluyan objetos únicos en la lista resultante. Por último, convertimos el conjunto (Set) en una lista utilizando el método collect(Collectors.toList()).

    Para obtener el resultado en el formato JSON deseado, podemos convertir los objetos List<categorydata> a un array JSON utilizando una biblioteca como Jackson. Aquí hay una implementación de ejemplo:

    private String toJson(List<categorydata> list) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        ObjectNode root = mapper.createObjectNode();
    
        ArrayNode arrayNode = mapper.createArrayNode();
    
        for (CategoryData item : list) {
            ObjectNode objectNode = mapper.convertValue(item, ObjectNode.class);
            arrayNode.add(objectNode);
        }
    
        root.set("finish", arrayNode);
    
        return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(root);
    }
    

    Este método utiliza un ObjectMapper para crear un objeto JSON que contiene un único array JSON con la clave “finish”. Luego, iteramos sobre los objetos List<categorydata> y convertimos cada objeto en un ObjectNode, que agregamos al array JSON. Finalmente, utilizamos el método writerWithDefaultPrettyPrinter() para convertir el objeto JSON en una cadena formateada.

Comments are closed.