Вопрос-ответ

How to find an object in an ArrayList by property

Как найти объект в ArrayList по свойству

Как я могу найти объект, Carnet, в ArrayList<Carnet> зная его свойство codeIsin.

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

public class Carnet {

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

// Setters and getters

}
Переведено автоматически
Ответ 1

В Java8 вы можете использовать потоки:

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

Кроме того, если у вас много разных объектов (не только Carnet) или вы хотите найти его по разным свойствам (не только по cideIsin), вы могли бы создать служебный класс, чтобы экапсулировать в нем эту логику:

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()));
}
}
Ответ 2

Вы не сможете без итерации.

Вариант 1

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

Вариант 2

Переопределите equals() метод Carnet.

Вариант 3

Вместо этого сохраняем ваш List как Map, используя codeIsIn в качестве ключа:

HashMap<String, Carnet> carnets = new HashMap<>();
// setting map
Carnet carnet = carnets.get(codeIsIn);
Ответ 3

If you use Java 8 and if it is possible that your search returns null, you could try using the Optional class.

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

Now a usage for it:

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();
}
}
Ответ 4

To find an object in an ArrayList by the property, We can use a function like this:

To find all the objects with a specific codeIsIn:

  public static List<Item> findBycodeIsin(Collection<Carnet> listCarnet, String codeIsIn) {

return items.stream().filter(item -> codeIsIn.equals(item.getCodeIsIn()))
.collect(Collectors.toList());
}

To find a Single item (If the codeIsIn is unique for each object):

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