在Java中8個工作,我有一個TreeSet
這樣定義:使用流收集到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
比某些值舊。但我無法弄清楚正確的Java 8語法來表達這一點。
這種嘗試實際上編譯,但給了我一個新的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))
)
);
但是,這並不編譯/似乎是方法引用有效的語法。
非常感謝您! – tbsalling
需要注意的一點是,如果TreeSet的類型(在本例中爲PositionReport)實現可比較性,則不需要比較器。 – xtrakBandit
繼續使用@xtrakBandit - 再次如果您不需要指定比較器(自然排序) - 您可以使它非常簡潔:'.collect(Collectors.toCollection(TreeSet :: new));' –