Trabalhando em Java 8, tenho um TreeSet
definido assim:
private TreeSet<PositionReport> positionReports =
new TreeSet<>(Comparator.comparingLong(PositionReport::getTimestamp));
PositionReport
é uma classe bastante simples definida assim:
public static final class PositionReport implements Cloneable {
private final long timestamp;
private final Position position;
public static PositionReport create(long timestamp, Position position) {
return new PositionReport(timestamp, position);
}
private PositionReport(long timestamp, Position position) {
this.timestamp = timestamp;
this.position = position;
}
public long getTimestamp() {
return timestamp;
}
public Position getPosition() {
return position;
}
}
Isso funciona bem.
Agora quero remover as entradas de TreeSet positionReports
onde timestamp
é mais antigo que algum valor. Mas não consigo descobrir a sintaxe correta do Java 8 para expressar isso.
Essa tentativa realmente compila, mas me dá uma novidade TreeSet
com um comparador indefinido:
positionReports = positionReports
.stream()
.filter(p -> p.timestamp >= oldestKept)
.collect(Collectors.toCollection(TreeSet::new))
Como posso expressar que desejo coletar em um TreeSet
com um comparador como Comparator.comparingLong(PositionReport::getTimestamp)
?
Eu teria pensado algo como
positionReports = positionReports
.stream()
.filter(p -> p.timestamp >= oldestKept)
.collect(
Collectors.toCollection(
TreeSet::TreeSet(Comparator.comparingLong(PositionReport::getTimestamp))
)
);
Mas isso não compila / parece ser uma sintaxe válida para referências de método.