Java 8で作業していると、TreeSet
次のように定義されます。
private TreeSet<PositionReport> positionReports =
new TreeSet<>(Comparator.comparingLong(PositionReport::getTimestamp));
PositionReport
次のように定義されたかなり単純なクラスです。
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;
}
}
これは正常に機能します。
ここで、ある値より古いTreeSet positionReports
場所からエントリを削除したいと思いtimestamp
ます。しかし、これを表現するための正しいJava8構文を理解することはできません。
この試みは実際にコンパイルされますがTreeSet
、未定義のコンパレータを備えた新しいものが得られます。
positionReports = positionReports
.stream()
.filter(p -> p.timestamp >= oldestKept)
.collect(Collectors.toCollection(TreeSet::new))
のTreeSet
ようなコンパレータで収集したいことをどのように表現しComparator.comparingLong(PositionReport::getTimestamp)
ますか?
私は次のようなことを考えていただろう
positionReports = positionReports
.stream()
.filter(p -> p.timestamp >= oldestKept)
.collect(
Collectors.toCollection(
TreeSet::TreeSet(Comparator.comparingLong(PositionReport::getTimestamp))
)
);
しかし、これはコンパイルされない/メソッド参照の有効な構文であるように見えます。