CollectionUtils in java utilizzando predicato

Ho un List<Object> e voglio restituire il primo valore che si trova la vera, cui corrisponde un predicato.

Ho scoperto che posso utilizzare CollectionUtils.find(collection,predicate) (Apache commons). Supponendo che il Object contiene una variabile intera chiamata : value , come faccio a specificare in predicato che il valore può essere 1,2,3,4,5 e a scartare quelle che non corrispondono. È possibile fare “contiene”.

Anche non utilizzando java 8 in grado di riprodurre.

  • apache commons ..
InformationsquelleAutor Rory Lester | 2014-09-01



3 Replies
  1. 26

    Per restituire il primo elemento nella lista che corrisponde a un dato predicato:

    MyObject res = CollectionUtils.find(myList, new Predicate<MyObject>() {
        @Override
        public boolean evaluate(MyObject o) {
            return o.getValue() >= 1 && o.getValue() <= 5;
        }
    });

    Per filtrare l’elenco in modo che contenga solo gli elementi corrispondenti predicato:

    CollectionUtils.filter(myList, new Predicate<MyObject>() {
        @Override
        public boolean evaluate(MyObject o) {
            return o.getValue() >= 1 && o.getValue() <= 5;
        }
    });

    Si può notare che il Predicate<MyObject> è lo stesso.

    • Ho pensato th OP voluto filtrare l’elenco (discard those that dont match). Si sono appena trovato il primo oggetto di corrispondenza il predicato.
    • Vale la pena notare che il generico Predicate è presente solo nella versione 4
    • si può essere di destra. Io non sono al 100% sicuro di quello che l’OP vuole fare…
    • No hai ragione, io sto usando il trovare, perché voglio tornare il primo valore che corrisponda. Grazie
    • Cosa dovrebbe fare il predicato di essere? dato che io sono sempre Il tipo di Predicato non è generico e non può essere parametrizzata con argomenti <MyObject>.
    • Quindi, è necessario lanciare il Object il suo effettivo tipo, quello che contiene il value variabile
    • Sì hanno provato, ma ancora non funziona, stesso errore.
    • Quale errore? Si prega di inviare
    • È lo stesso problema : Predicato non è generico e non può essere parametrizzata con argomenti <MyObject> . Sembra essere perché sto usando collezioni, si sta utilizzando il predicato al posto di quella di default predicato che non consentono di parametri. C’è un modo per aggirare questo, senza il passaggio di un parametro?
    • MyObject deve essere sostituito con il tipo di elementi che contiene in elenco, il tipo che contiene il value variabile.

  2. 5

    In Java 8 è possibile scrivere

    Optional<Integer> found = list.stream().filter(i -> i >= 1 && i <= 5).findAny();

    Prima di Java 7 la soluzione più semplice è quello di utilizzare un ciclo.

    Integer found = null;
    for(integer i : list)
       if (i >= 1 && i <= 5) {
            found = i;
            break;
       }

    Questo sarebbe il più pulito e veloce come Java 7 non ha il supporto per le espressioni lambda.

  3. 0

    È possibile utilizzare Collezioni.removeIf (sto supponendo che si sta utilizzando JDK 8). È inoltre possibile utilizzare un Flusso :

    list = list.stream().filter(predicate).collect(Collectors.toList());

    Utilizzando Apach Commons Collezioni, è possibile utilizzare CollectionUtils.filtro.

    • Purtroppo io non sono, che è il motivo per cui ho scelto di utilizzare CollectionUtils.

Lascia un commento