Cómo encontrar un objeto en una ArrayList por propiedad

¿Cómo puedo encontrar un objeto, Carnet , en una ArrayList conociendo su propiedad codeIsin ?

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

No puedes sin una iteración.

Opción 1

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

opcion 2

Reemplaza el método equals() de Carnet .

Opción 3

En su lugar, codeIsIn su List como un Map , usando codeIsIn como la clave:

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

En Java8 puedes usar streams:

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

Además, en caso de que tenga muchos objetos diferentes (no solo Carnet ) o quiera encontrarlos por diferentes propiedades (no solo por cideIsin ), podría construir una clase de utilidad, para ecapsular esta lógica en ella:

 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())); } } 

Anula los códigos hash y equivale a los métodos

Para encontrar objetos que sean significativamente iguales, debe anular los métodos equals y hashcode para la clase. Puedes encontrar un buen tutorial aquí.

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

Aquí hay una solución usando guayaba

 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 } 

Si usa Java 8 y si es posible que su búsqueda arroje un valor nulo, podría intentar usar la clase Opcional .

Para encontrar 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(); } 

Ahora un uso para eso:

 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(); } }