web-dev-qa-db-ger.com

So finden Sie ein Objekt in einer ArrayList anhand der Eigenschaft

Wie kann ich ein Objekt Carnet in einem ArrayList<Carnet> finden, dessen Eigenschaft codeIsin bekannt ist?.

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

public class Carnet {

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

    // Setters and getters

}
47
user1279522

Sie können nicht ohne eine Iteration.

Option 1

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

Option 2

Überschreiben Sie die equals()-Methode von Carnet.

Option 3

Speichern Sie stattdessen Ihre List als Map und verwenden Sie codeIsIn als Schlüssel:

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

In Java8 können Sie Streams verwenden:

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

Falls Sie über viele verschiedene Objekte verfügen (nicht nur Carnet) oder nach verschiedenen Eigenschaften (nicht nur durch cideIsin) suchen möchten, können Sie eine Dienstprogrammklasse erstellen, um diese Logik darin zu kapseln:

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()));
    }
}
30
oleg.cherednik

Hier ist eine Lösung mit Guava

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
}
1
Linh

Überschreiben Sie Hashcode- und Equals-Methoden

0
Ugur Artun

Wenn Sie Java 8 verwenden und Ihre Suche möglicherweise null zurückgibt, können Sie die Klasse Optional verwenden. 

So finden Sie ein 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();
}

Nun eine Verwendung dafür:

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
RKrum

Um Objekte zu finden, die sinnvollerweise gleich sind, müssen Sie die equals- und hashcode-Methoden für die Klasse überschreiben. Hier finden Sie ein gutes Tutorial.

http://www.thejavageek.com/2013/06/28/signifikanz-von-äquivalente-und-hashcode/

0
Prasad Kharkar