ciao!

io ho una lista di questi oggetti:
codice:
import org.dizitart.no2.IndexType;
import org.dizitart.no2.objects.Id;
import org.dizitart.no2.objects.Index;
import org.dizitart.no2.objects.Indices;

import java.io.Serializable;
import java.util.Date;

@Indices(value = {
        @Index(value = "gruppo", type = IndexType.NonUnique),
        @Index(value = "titolo", type = IndexType.Unique)
})
public class Nota implements Serializable {

    @Id
private long notaId;
    private String gruppo;
    private String titolo;
    private String testo;
    private Date data;

    public long getNotaId() {
        return notaId;
    }

    public void setNotaId(long notaId) {
        this.notaId = notaId;
    }

    public String getTitolo() {
        return titolo;
    }

    public void setTitolo(String titolo) {
        this.titolo = titolo;
    }

    public String getTesto() {
        return testo;
    }

    public void setTesto(String testo) {
        this.testo = testo;
    }

    public Date getData() {
        return data;
    }

    public void setData(Date data) {
        this.data = data;
    }

    public String getGruppo() {
        return gruppo;
    }

    public void setGruppo(String gruppo) {
        this.gruppo = gruppo;
    }
}

la lista può avere lo stesso gruppo ripetuto più volte.
io avrei la necessità di iterare su questa lista prendendo i valori univoci di gruppo.
ho fatto un pò di tentativi, di cui questo è l'ultimo:
codice:
@FXML
public void initialize() {
    List<Nota> list = new ArrayList<>(db.getGruppi().toList());
    list.stream().filter(distinctByKey(n -> n.getGruppo())).collect(Collectors.toList());

    for (Nota n : list) {
        System.out.println(n.getGruppo());
    }
}

public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
    Map<Object, Boolean> map = new ConcurrentHashMap<>();
    return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}

ma compaiono i valori doppi.
come dovrei fare??