Localizar posicao de um objeto em uma lista

Salve galera, estou estudando listas e como usar class dentro de outras classes.
Tennho 3 classes no programa q estou criando.

  1. Products.
  2. Clients.
  3. Restaurante.

Dentro de cliente tem uma lista de produtos.
Dentro de restaurante tem uma lista de clientes.

Estou tentando salvar uma ordem dentro do cliente em específico, mas meu indexOf só retorna -1.

(OBS: Ta bem loouco isso, mas é de proposito para entender bem como as coisas funcionam.)

Restaurant r1 = new Restaurant();
r1.creatAnClient(new Client("Adilson", 555));

Aqui eu faço uma pesquisa pelo ID pra saber se cliente existe.

Integer hasId = clientList.indexOf(clientList.stream().filter(x -> x.getID() == id).findFirst().orElse(null));
            if (hasId != null ){
                clientList.get(0).shopping(order); 
                System.out.println("HAS ID: " + hasId)  // Aqui é teste é sempre retorna -1;
            }

clientList.get(0).shopping(order);
Colocando 0 ele adiciona certinho e imprimi os dados do cliente com os produtos.
Queria era passar hasId dentro do get() para ser adicionado dentro do cliente responsável pelo id.

Esse ID do cliente é de qual tipo?

Do tipo Integer.

Conseguir agora pq a IDE falou pra mudar o ==
ficou assim: x -> Objects.equals(x.getID(), id

Mas nao entendi muito bem o porque disso.

Como vc já está usando o filter(), não faz sentido estar usando o indexOf também.

Eu entendo que o indexOf vc usa quando vc já tem o objeto em mãos e só quer saber o indice dele dentro da lista. Já o filter() é o que vc precisa, pois vc não tem o objeto em mãos e precisa dele. O indice é irrelevante. Então ficaria algo assim:

import java.util.ArrayList;
import java.util.List;

public class Main {
  public static void main(String... args) {
    class Order {
    }

    class Cliente {
      private String nome;
      private int id;

      Cliente(String nome, int id) {
        this.nome = nome;
        this.id = id;
      }

      int getId() {
        return this.id;
      }

      void shopping(Order order) {
      }
    }

    Order order = new Order();

    List<Cliente> clientList = new ArrayList<>();
    clientList.add(new Cliente("aaa", 111));
    clientList.add(new Cliente("bbb", 222));
    clientList.add(new Cliente("ccc", 333));

    clientList // @formatter:off
      .stream()
      .filter(c -> c.getId() == 222)
      .findFirst()
      .ifPresent(c -> c.shopping(order));
  }
}

EDIT
Como é do tipo Integer, poderia ficar assim também:

.filter(c -> c.getId().equals(222))
2 curtidas

uiii nunca vi esse .ifPresent(c -> c.shopping(order));
Vou testar aqui.

Eu conseguir da seguinte forma:

Main:

     r1.creatAnClient(new Client("Adilson", 555));
    r1.creatAnClient(new Client("Adilson", 244));

    r1.makerAOrder(555, new Products("Pizza 30 cm", "Coca-Cola", true));
    r1.makerAOrder(244, new Products("Pizza 30 cm", "Coca-Cola", true));

Class:

  Client hasId = clientList.stream().filter(x -> Objects.equals(x.getID(), id)).findFirst().orElse(null);
        Integer i = clientList.indexOf(hasId);
        if (hasId != null ){
            clientList.get(i).shopping(order);
        }

Vou testar da forma que tu falou.

Que bom que conseguiu. Mas vc viu como vc tá fazendo 1 ação desnecessária?

Vc já tem o Client, não precisa mais saber o indice. Poderia ficar assim:

Client hasId = clientList.stream().filter(x -> Objects.equals(x.getID(), id)).findFirst().orElse(null);
if (hasId != null ){
    hasId.shopping(order);
}
1 curtida

Dessa forma: Objects.equals(x.getID(), id) eu conseguir pq a IDE deu erro. Mas nao entendi muito bem desse codigo.

Conseguir da forma que voce falou, achei mais pratico, mas ele so funciona se for com equal, se for com == nao funciona.

Vlllw demais, ja aprendi alguma coisa.

É. Como vc tá usando Integer ao invés de int, o correto é usar equals() mesmo. Eu tinha sugerido isso antes de saber que era Integer.

Sobre o Objects.equals(), do meu ponto de vista, esta é a vantagem de usar:

Digamos que vc queira comparar 2 Integer, X e Y, e vc sabe com toda certeza do mundo que nenhum deles é null.

Integer X = 1;
Integer Y = 2;

Os 2 modos abaixo são equivalentes:

// Modo 1
System.out.println(Objects.equals(X, Y));

// Modo 2
System.out.println(X.equals(Y));

Mas digamos que haja a possibilidade de X ser null. Para evitar um NullPointerException vc teria que adicionar um if:

if (X != null) {
    X.equals(Y);
}

Mas usando Objects.equals() vc não precisa deste if porque ele já faz esta checagem por vc internamente, veja:

Não sei se tem mais vantagens, foi só essa que eu consegui observar até o momento.

1 curtida

Entendi. Entao nesse caso eu poderia usar o Objects.equals() para caso nao fosse passado o id ou fosse colocado null de proposito. Assim ele trataria esse null diferente do x.iguals(y).

1 curtida