Ho alcuni problemi con un esercizio dove è richiesto l'utilizzo dell'interfaccia funzionale Predicate.
L'esercizio richiede di creare una classe "Citta" che astrae il concetto di città e che dichiara le variabili nome di tipo String e capoluogo e diMare di tipo boolean.
Bisogna inoltre creare una classe TestCitta con un metodo main che stampa la lista di città sfruttando reference a metodi e interfaccia Pradicate.
Questa è la mia soluzione:
codice:
package com.java8.mod15.dati;

public class Citta {
    private String nome;
    private boolean capoluogo;
    private boolean diMare;
    
    public Citta(String nome, boolean capoluogo, boolean diMare) {
        this.nome=nome;
        this.capoluogo=capoluogo;
        this.diMare=diMare;
    }
    
    public boolean isDiMare() {
        if(diMare == true) {
            return true;
        }
        else {
            return false;
        }
    }
    
    public boolean isCapoluogo() {
        if(capoluogo == true) {
            return true;
        }
        else {
            return false;
        }
    }
    
    public String toString() {
        return nome;
    }
}
codice:
package com.java8.mod15.test;

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

import com.java8.mod15.dati.*;

public class TestCitta {
    
    public static void main(String args[]) {
        
        Citta milano = new Citta("Milano",true,false);
        Citta bari = new Citta("Bari",true,true);
        Citta foggia = new Citta("Foggia",false,false);
        Citta venezia = new Citta("Venezia",true,true);
        Citta roma = new Citta("Roma",true,false);
    
        List<Citta> listaCitta = new ArrayList<>();        
        listaCitta.add(milano);
        listaCitta.add(bari);
        listaCitta.add(foggia);
        listaCitta.add(venezia);
        listaCitta.add(roma);
        
1      System.out.println("Lista città:\n" + getCittaFiltrate(listaCitta, TestCitta::getCitta));    
        
2      public static List<Citta> getCittaFiltrate(List<Citta> listaCitta, Predicate<Citta> p) {
            final Iterator<Citta> i = listaCitta.iterator();
            while(i.hasNext()) {            
                Citta citta = i.next();
3               if(!p.test(citta)) {
                    i.remove();
                }
            }
4           return listaCitta;
        }
         
    }
    
    public static boolean getCitta(Citta citta) {
            return !"".equals(citta.toString());
    }
    
}
però mi vengono segnalati in corrispondenza delle righe che ho segnato rispettivamente questi problemi:
1
The method getCittaFiltrate(List<Citta>, TestCitta::getCitta) is undefined for the type TestCitta
2
Multiple markers at this line
- p cannot be resolved to a variable
- Illegal modifier for parameter $missing$; only final is permitted
- Syntax error, insert ";" to complete Statement
- Predicate cannot be resolved to a variable
- Citta cannot be resolved to a variable
- Syntax error, insert "VariableDeclarators" to complete LocalVariableDeclaration
- List cannot be resolved to a variable
- Citta cannot be resolved to a variable
- Syntax error, insert ";" to complete LocalVariableDeclarationStatement
3
p cannot be resolved
4
Void methods cannot return a value

Non riesco a capire come risolvere questi problemi, sicuramente ho capito io poco sull'utilizzo delle interfacce funzionali del package java.util.function.

Mi aiutate a capire?