Como encontrar um object em uma ArrayList por propriedade

Como posso encontrar um object, Carnet , em um ArrayList sabendo sua propriedade codeIsin .

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

Você não pode sem uma iteração.

Opção 1

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

opção 2

Substitua o método equals() do Carnet .

Opção 3

Armazenando sua List como um Map , usando codeIsIn como chave:

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

No Java8, você pode usar streams:

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

Além disso, caso você tenha muitos objects diferentes (não apenas Carnet ) ou queira encontrá-los por propriedades diferentes (não apenas por cideIsin ), você pode criar uma class de utilitário para refletir essa lógica:

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

Substituir os methods hashcode e equals

Para encontrar objects que são significativamente iguais, você precisa replace methods equals e hashcode para a class. Você pode encontrar um bom tutorial aqui.

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

Aqui está uma solução usando Goiaba

 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 você usa o Java 8 e se é possível que sua pesquisa retorne null, você pode tentar usar a class Optional .

Para encontrar uma caderneta:

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

Agora um uso para isso:

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