Come trovare un object in un object ArrayList per proprietà

Come posso trovare un object, Carnet , in un ArrayList conosce il suo codeIsin proprietàIsin.

 List listCarnet = carnetEJB.findAll(); public class Carnet { private String codeTitre; private String nomTitre; private String codeIsin; // Setters and getters } 

Non puoi senza un’iterazione.

opzione 1

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

opzione 2

Sostituisci il metodo equals() di Carnet .

Opzione 3

Memorizza la tua List come una Map , invece, usando codeIsIn come chiave:

 HashMap carnets = new HashMap<>(); // setting map Carnet carnet = carnets.get(codeIsIn); 

In Java8 puoi utilizzare gli stream:

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

Inoltre, nel caso in cui tu abbia molti oggetti diversi (non solo Carnet ) o vuoi trovarli con proprietà diverse (non solo da cideIsin ), potresti build una class di utilità, per ecapsolare questa logica al suo interno:

 public final class FindUtils { public static  T findByProperty(Collection col, Predicate filter) { return col.stream().filter(filter).findFirst().orElse(null); } } public final class CarnetUtils { public static Carnet findByCodeTitre(Collection listCarnet, String codeTitre) { return FindUtils.findByProperty(listCarnet, carnet -> codeTitre.equals(carnet.getCodeTitre())); } public static Carnet findByNomTitre(Collection listCarnet, String nomTitre) { return FindUtils.findByProperty(listCarnet, carnet -> nomTitre.equals(carnet.getNomTitre())); } public static Carnet findByCodeIsIn(Collection listCarnet, String codeIsin) { return FindUtils.findByProperty(listCarnet, carnet -> codeIsin.equals(carnet.getCodeIsin())); } } 

Sovrascrivi i metodi hashcode e equals

Per trovare oggetti che siano significativamente uguali, è necessario sovrascrivere i metodi equals e hashcode per la class. Puoi trovare un buon tutorial qui.

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

Ecco una soluzione utilizzando Guava

 private User findUserByName(List userList, final String name) { Optional userOptional = FluentIterable.from(userList).firstMatch(new Predicate() { @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 } 

Se si utilizza Java 8 e se è ansible che la ricerca restituisca null, è ansible provare a utilizzare la class Optional .

Per trovare un carnet:

 private final Optional findCarnet(Collection 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(); } 

Ora un uso per questo:

 public void yourMethod(String codeIsin){ List listCarnet = carnetEJB.findAll(); Optional 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(); } }