Verificar em array list de objetos X se algum desses objetos possui atributo Y com valor Z

Caros usuários,

Tenho uma ArrayList de, por exemplo, clientes, e gostaria de fazer uma varredura desta array list à procura de um cliente com nome joao, por exemplo.

Geralmente utilizo for e while para varrer a lista à procura do cliente com esse nome.
Há alguma outra forma de fazer essa busca? Algo similar ao Locate do Delphi, talvez…
Pensei em utilizar o indexOf(), mas ele procura um objeto, e não um atributo de um objeto, neste caso cliente.

Este é o código que estou utilizando no momento :

private List listCarts = new ArrayList();

    protected void addItem(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        
        if (session.getAttribute("username") != null && !session.getAttribute("username").toString().isEmpty()) {
            String username = session.getAttribute("username").toString();
            int itemID = Integer.parseInt(request.getParameter("itemID"));
            int amount = Integer.parseInt(request.getParameter("amount"));
            String type = (request.getParameter("type"));

            Item aItem = new Item(itemID, type, amount);
            for (int i = 0; i < listCarts.size(); i++) {               
                if (listCarts.get(i).getUsername().equals(username)) {
                    if (listCarts.get(i).getItem() == null) {
                        List<Item> listItem = new ArrayList<Item>();
                        listItem.add(aItem);
                        listCarts.get(i).setItem(listItem);
                    } else {
                        for (int j = 0; j < amount; j++) {
                            listCarts.get(i).getItem().add(aItem);
                        }
                    }
                    break;
                }
            }

            RequestDispatcher rd = request.getRequestDispatcher("/menu.jsp");
            rd.forward(request, response);
        } else {
            RequestDispatcher rd = request.getRequestDispatcher("/index.jsp");
            rd.forward(request, response);
        }
    }

Obrigado!

Não há muito do que fugir, no que diz respeito a iteração. Mesmo que tu quisesse sobrescrever o contains da interface List, você teria de iterar sob a sua lista.
Se criar uma lista de String, somente com os nomes, e depois usar o método contains, é para se tornar ainda mais lento. No fim das contas, deixe como está.
Só recomendo usar um LinkedList e o Iterator, será mais rápido. Todavia, se a lista for pequena, a diferença será insignificante. É só uma pequena dica de perfomance.

Abraços.

[quote]Há alguma outra forma de fazer essa busca? Algo similar ao Locate do Delphi, talvez…
Pensei em utilizar o indexOf(), mas ele procura um objeto, e não um atributo de um objeto, neste caso cliente. [/quote]

O método contains tem o seguinte codigo fonte:

public boolean contains(Object o) { return indexOf(o) &gt;= 0; }

fonte do metodo indexOf usando pelo contains:

public int indexOf(Object o) { if (o == null) { for (int i = 0; i &lt; size; i++) if (elementData[i]==null) return i; } else { for (int i = 0; i &lt; size; i++) if (o.equals(elementData[i])) return i; } return -1; }

Repare que na realidade o método contains usa o metodo equals para fazer a procura, sendo assim se seu objeto cliente sobrescrever equals e hashcode pelo nome, voce poderia fazer:

Cliente cliente = new Cliente( &quot;joao&quot; );
boolean contem = listCarts.contains(cliente); 

Bom ae você pode dizer só que meu cliente tem o metodo hashCode e equals sobrescrito pelo id por exemplo, sendo assim voce poderia usar para este caso o pattern decorator… enfim ae depende da implementação.

Espero ter ajudado.