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.

Obtener un objeto de una lista si un campo particular en el objeto coincide con cualquier valor de una lista separada.

Tengo una lista de cadenas como la que está debajo que contiene todos los números de tienda:


List<String> stores = new ArrayList<>;

Y una lista de objetos como esta:


List<UserStores> userStores = new ArrayList<>;

Ahora, la clase UserStores se parece a esto:

public class UserStores {
    private String storeNo;
    private String storeName;
    private String country;
}

Quiero obtener todos los UserStores de esta lista <code>List & lt; UserStores & gt;</code> si alguno de los storeNo está presente en la lista ‘stores’ dada anteriormente.

Por ejemplo,

stores = {1,2};
UserStores = [ {2, qwe, wqew}, {1,ABC, India}, {3, asd, USA} ];

resultado esperado = [{1,ABC, India}, {2, qwe, wqew}]; en el orden de las tiendas presentes en la lista 'stores',

¿Cómo puedo hacer esto usando stream/collectors?

Mi código actual es algo así … ¿se puede mejorar esto?

private static List<UserStores> getModifiedUserStoresList(
            List<String> stores, List<UserStores> userStores
    ) {
        List<UserStores> userStoreList = new ArrayList<>();
        for(int i = 0; i < stores.size(); i++) {
            for(int j = 0; j < userStores.size(); j++) {
                if(userStores.get(j).getStoreNo().equals(stores.get(i))) {
                    userStoreList.add(userStores.get(j));
                    break;
                }
            }
        }
        return userStoreList;
    }
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Puede utilizar el stream y el filtro de Java para lograr el mismo resultado de una manera más concisa y legible. Aquí hay un ejemplo de código para lograr el resultado esperado:

    private static List<userstores> getModifiedUserStoresList(List<string> stores, List<userstores> userStores) {
        return userStores.stream() // convierte la lista a un stream
            .filter(us -> stores.contains(us.getStoreNo())) // filtra solo los UserStores cuyo storeNo está en la lista de tiendas
            .sorted((us1, us2) -> {
                // ordena en función del orden de las tiendas en la lista de tiendas
                int index1 = stores.indexOf(us1.getStoreNo());
                int index2 = stores.indexOf(us2.getStoreNo());
                return Integer.compare(index1, index2);
            })
            .collect(Collectors.toList()); // recopila el resultado como una List<userstores>
    }
    

    Este código utiliza el método filter() para filtrar solo los UserStores cuyo storeNo está en la lista de tiendas, luego el método sorted() para ordenar el resultado en función del orden de las tiendas en la lista de tiendas, y finalmente el método collect() para recopilar el resultado como una List.

    Este código es más conciso y legible que el código original que proporcionó, y también utiliza todo el potencial de stream y collectors de Java.

Comments are closed.