如何按属性在ArrayList中查找对象

58 java collections arraylist

如何CarnetArrayList<Carnet>了解其属性的情况下找到对象codeIsin.

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

public class Carnet {

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

    // Setters and getters

}
Run Code Online (Sandbox Code Playgroud)

Men*_*nno 63

你不能没有迭代.

选项1

Carnet findCarnet(String codeIsIn) {
    for(Carnet carnet : listCarnet) {
        if(carnet.getCodeIsIn().equals(codeIsIn)) {
            return carnet;
        }
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

选项2

覆盖equals()方法Carnet.

选项3

存储您List作为Map代替,使用codeIsIn的关键:

HashMap<String, Carnet> carnets = new HashMap<>();
// setting map
Carnet carnet = carnets.get(codeIsIn);
Run Code Online (Sandbox Code Playgroud)

  • 我没有Option2。我重写`equals()`然后做什么? (2认同)

ole*_*nik 47

Java8中,您可以使用流:

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

此外,如果您有许多不同的对象(不仅仅是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()));
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 7

如果您使用Java 8并且搜索可能返回 null,则可以尝试使用 Optional类。

查找单证册:

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();
}
Run Code Online (Sandbox Code Playgroud)

现在它的用法:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)


Len*_*man 7

要通过属性查找 ArrayList 中的对象,我们可以使用如下函数:

要查找具有特定 codeIsIn 的所有对象:

  public static List<Item> findBycodeIsin(Collection<Carnet> listCarnet, String codeIsIn) {
            
         return items.stream().filter(item -> codeIsIn.equals(item.getCodeIsIn()))
        .collect(Collectors.toList());
     }
Run Code Online (Sandbox Code Playgroud)

查找单个项目(如果每个对象的 codeIsIn 都是唯一的):

public static Carnet findByCodeIsIn(Collection<Carnet> listCarnet, String codeIsIn) {
    return listCarnet.stream().filter(carnet-> codeIsIn.equals(carnet.getCodeIsIn()))
            .findFirst().orElse(null);
}
Run Code Online (Sandbox Code Playgroud)