Lambda

di il
4 risposte

Lambda

Scusate ragazzi ho fatto un esercizio con le Lambda, ma non capisco perché non funzioni

public class Scuola {
private List<Docente> docenti;
...
public void filtraDocente (Predicate<Docente> pred) {
docenti.removeIf(pred);
}
}

public class Principale {

public static void main(String[] args) {

Scanner input = new Scanner(System.in);
List<Docente> docenti = new ArrayList<Docente>();
Scuola marconi = new Scuola();

for(int i = 0; i < 2; i++) {
System.out.println("Scrivi Nome-Cognome del nuovo docente ");
String nome = input.nextLine();
String cognome = input.nextLine();
docenti = marconi.editDocenti(nome, cognome);
System.out.println(docenti.toString());// stampa
}

marconi.filtraDocente((docente)-> docente.getSalario() > 900);

System.out.println(docenti.toString());// stampa

input.close();


}

}

Il problema è che "marconi.filtraDocente((docente)-> docente.getSalario() > 900);" non funziona, nel momento in cui vado a stampare mi restituisce la stessa lista. Dove ho sbagliato?
Grazie a tutti

4 Risposte

  • Re: Lambda

    Bait ha scritto:


    Il problema è che "marconi.filtraDocente((docente)-> docente.getSalario() > 900);" non funziona, nel momento in cui vado a stampare mi restituisce la stessa lista. Dove ho sbagliato?
    Devi spiegare meglio come gestisci il List<Docente> docenti in Scuola rispetto al List<Docente> docenti del main.
    Dal poco codice postato non si capisce.
    Perché Scuola non ha un addDocente (o aggiungiDocente, in italiano)? Cosa fa editDocenti? E perché restituisce un List<Docente>? Dove viene inserito il salario? (non si vede dal codice postato).
  • Re: Lambda

    Hai ragione!
    Lascia perdere alcuni costruttori, ho fatto i metodi in base alle domande di un esercizio, quindi alcuni metodi possono non avere senso.

    package compito.docente;

    import java.util.function.IntConsumer;

    public class Docente implements Comparable<Docente> {

    private String nome; //final
    private String cognome; //final
    private int salario;

    public Docente(String nome, String cognome, String salario) {
    this.nome = nome;
    this.cognome = cognome;
    this.salario = Integer.valueOf(salario); //Integer.parseInt
    }

    public Docente(String nome,String cognome) {
    this.nome = nome;
    this.cognome = cognome;
    this.salario = 0;

    }

    public Docente(String nome, String cognome, int salario) {
    this.nome = nome;
    this.cognome = cognome;
    this.salario = salario;

    }

    public int getSalario() {
    return salario;
    }

    public void setSalario(int salario) {
    this.salario = salario;
    }

    public String getNome() {
    return nome;
    }

    public String getCognome() {
    return cognome;
    }


    @Override
    public String toString() {
    return nome+" "+cognome+" "+salario;
    }

    //controlliamo soluzione soccessive
    @Override
    public int compareTo(Docente insegnante) {
    return this.salario-insegnante.salario; //questa operazione è possibile perché mi riferisco alla stessa classe

    }

    //vedere la soluzione
    public static IntConsumer indovina(Docente arg) {
    return (x)->{
    if(arg.salario == x)
    System.out.println("Hai indovinato");
    };
    }

    }


    package compito.scuola;

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    import java.util.function.Predicate;

    import compito.docente.Docente;

    public class Scuola {
    private List<Docente> docenti;
    private static Random genarator = new Random();

    public Scuola() {
    docenti = new ArrayList<Docente>();
    }

    //controllare
    public List<Docente> editDocenti(String nome,String cognome){

    List<Docente> clone_docenti = new ArrayList<Docente>(docenti); //copia docenti
    clone_docenti.add(new Docente(nome, cognome, genarator.nextInt(500)+500));

    docenti = new ArrayList<Docente>(clone_docenti);
    return clone_docenti;
    }

    //controllare
    public void filtraDocente (Predicate<Docente> pred) {
    docenti.removeIf(pred);
    }

    }

    package compito.scuola;

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    import compito.docente.Docente;

    public class Principale {

    public static void main(String[] args) {

    Scanner input = new Scanner(System.in);
    List<Docente> docenti = new ArrayList<Docente>();
    Scuola marconi = new Scuola();

    for(int i = 0; i < 2; i++) {
    System.out.println("Scrivi Nome-Cognome del nuovo docente ");
    String nome = input.nextLine();
    String cognome = input.nextLine();
    docenti = marconi.editDocenti(nome, cognome);
    System.out.println(docenti.toString());// stampa
    }

    marconi.filtraDocente((docente)-> docente.getSalario() > 900);

    System.out.println(docenti.toString());// stampa

    input.close();


    }

    }

    Grazie per l'aiuto. Ho bisogno di pratica per ragionare con le Lambda
  • Re: Lambda

    Ora che hai postato il codice intero, il problema è assolutamente chiaro.
    Nel editDocenti fai diversi "giri" di copia (direi inutili) della lista. Alla fine fai:
    		docenti = new ArrayList<Docente>(clone_docenti);
    		return clone_docenti;
    Restituisci clone_docenti, non docenti.

    Questo clone_docenti è la lista "precedente". Quando nel main fai:
    		System.out.println(docenti.toString());// stampa
    
    Questo docenti NON è la lista su cui il removeIf opera!! Ma è la lista allo step precedente.

    Quindi: risolvi i giri inutili di copia. Per quale motivo applicavi tutte quelle copie? Se l'obiettivo è quello di non esporre la lista "viva" ma solo una copia (è una possibilità lecita), si può fare ma non in quel modo.

    Bait ha scritto:


    Ho bisogno di pratica per ragionare con le Lambda
    E visto che vuoi fare pratica con le lambda, metti in Scuola un metodo es. forEach (ispirato al forEach di Iterable) che riceve un Consumer<? super Docente> in modo che nel main puoi stampare i docenti SENZA usare direttamente la lista.
  • Re: Lambda

    TI RINGRAZIO, ero convinto che l'errore stava sulla lambda e quindi non mi ero concentrato su tutto il codice.
    In realtà ho fatto un metodo del genere (editDocente) perché non capivo in realtà cosa chiedeva il testo.

    Ora sicuramente ho sbagliato, ma era per un esempio che alla fine mi sono adattato.
    (testo)
    "Un metodo editDocenti() che ritorna una copia della variabile di istanza docenti modificata in modo tale che il primo elemento sia un docente il cui salario sia un numero casuale con valore massimo 1000 e con valore minimo 500, ed il cui nome e cognome siano inseriti in input da tastiera"

    Devo provare quello che dici te!
Devi accedere o registrarti per scrivere nel forum
4 risposte