Comment trouver un objet dans un ArrayList par propriété

Comment puis-je trouver un objet, Carnet dans un ArrayList<Carnet> connaître sa propriété codeIsin.

List<Carnet> listCarnet = carnetEJB.findAll();

public class Carnet {

    private String codeTitre;
    private String nomTitre;
    private String codeIsin;

    // Setters and getters

}
38
demandé sur user861594 2013-07-08 16:27:39

6 réponses

Vous ne pouvez pas sans une itération.

Option 1

Carnet findCarnet(String codeIsIn) {
    for(Carnet carnet : listCarnet) {
        if(carnet.getCodeIsIn().equals(codeIsIn)) {
            return carnet;
        }
    }
    return null;
}

Option 2

Remplacer equals() méthode Carnet.

Option 3

stocker votre ListMap à la place, en utilisant codeIsIn comme la clé:

HashMap<String, Carnet> carnets = new HashMap<>();
// setting map
Carnet carnet = carnets.get(codeIsIn);
53
répondu Menno 2013-07-08 12:38:27

Java8 vous pouvez utiliser les flux:

public static Carnet findByCodeIsIn(Collection<Carnet> listCarnet, String codeIsIn) {
    return listCarnet.stream().filter(carnet -> codeIsIn.equals(carnet.getCodeIsin())).findFirst().orElse(null);
}

en outre, dans le cas où vous avez beaucoup d'objets différents (non seulement Carnet) ou vous voulez le trouver par différentes propriétés (pas seulement par cideIsin), vous pouvez construire une classe utilitaire, pour écapsuler cette logique en elle:

public final class FindUtils {
    public static <T> T findByProperty(Collection<T> col, Predicate<T> filter) {
        return col.stream().filter(filter).findFirst().orElse(null);
    }
}

public final class CarnetUtils {
    public static Carnet findByCodeTitre(Collection<Carnet> listCarnet, String codeTitre) {
        return FindUtils.findByProperty(listCarnet, carnet -> codeTitre.equals(carnet.getCodeTitre()));
    }

    public static Carnet findByNomTitre(Collection<Carnet> listCarnet, String nomTitre) {
        return FindUtils.findByProperty(listCarnet, carnet -> nomTitre.equals(carnet.getNomTitre()));
    }

    public static Carnet findByCodeIsIn(Collection<Carnet> listCarnet, String codeIsin) {
        return FindUtils.findByProperty(listCarnet, carnet -> codeIsin.equals(carnet.getCodeIsin()));
    }
}
17
répondu oleg.cherednik 2018-07-11 18:48:39

Outrepasser le hashcode et égaler les méthodes

0
répondu Ugur Artun 2013-07-08 12:30:11

Pour trouver des objets qui sont véritablement égaux, vous devez remplacer equals et hashcode méthodes pour la classe. Vous pouvez trouver un bon tutoriel ici.

http://www.thejavageek.com/2013/06/28/significance-of-equals-and-hashcode/

0
répondu Prasad Kharkar 2013-07-08 12:31:52

Voici une solution en utilisant Goyave

private User findUserByName(List<User> userList, final String name) {
    Optional<User> userOptional =
            FluentIterable.from(userList).firstMatch(new Predicate<User>() {
                @Override
                public boolean apply(@Nullable User input) {
                    return input.getName().equals(name);
                }
            });
    return userOptional.isPresent() ? userOptional.get() : null; // return user if found otherwise return null if user name don't exist in user list
}
0
répondu Phan Van Linh 2017-11-21 03:04:28

Si vous utilisez Java 8 et si il est possible que votre recherche renvoie null, vous pouvez essayer d'utiliser le Facultatif classe.

Pour trouver un carnet:

private final Optional<Carnet> findCarnet(Collection<Carnet> yourList, String codeIsin){
    // This stream will simply return any carnet that matches the filter. It will be wrapped in a Optional object.
    // If no carnets are matched, an "Optional.empty" item will be returned
    return yourList.stream().filter(c -> c.getCodeIsin().equals(codeIsin)).findAny();
}

utilisation:

public void yourMethod(String codeIsin){
    List<Carnet> listCarnet = carnetEJB.findAll();

    Optional<Carnet> carnetFound = findCarnet(listCarnet, codeIsin);

    if(carnetFound.isPresent()){
        // You use this ".get()" method to actually get your carnet from the Optional object
        doSomething(carnetFound.get());
    }
    else{
        doSomethingElse();
    }
}
0
répondu Rhuan Krum 2018-05-17 18:18:32