java – 使用自定义比较器将流收集到TreeSet中

在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中删除条目,其中时间戳早于某个值。但我不能弄清楚正确的Java 8语法来表达这一点。

这个尝试实际上是编译,但给我一个新的TreeSet与未定义的比较器:

positionReports = positionReports
        .stream()
        .filter(p -> p.timestamp >= oldestKept)
        .collect(Collectors.toCollection(TreeSet::new))

我如何表示,我想收集到一个比较器如Comparator.comparingLong(PositionReport :: getTimestamp)的TreeSet?

我会想到的东西

positionReports = positionReports
        .stream()
        .filter(p -> p.timestamp >= oldestKept)
        .collect(
            Collectors.toCollection(
                TreeSet::TreeSet(Comparator.comparingLong(PositionReport::getTimestamp))
            )
        );

但是这不编译/似乎是方法引用的有效语法。

最佳答案
Comparator<PositionReport> byTimestamp =
    Comparator.comparingLong(PositionReport::getTimestamp);

Supplier<TreeSet<PositionReport>> supplier =
    () -> new TreeSet<PositionReport>(byTimestamp);

positionReports = positionReports.stream()
                                 .filter(p -> p.getTimeStamp() >= oldestKept)
                                 .collect(Collectors.toCollection(supplier));

转载注明原文:java – 使用自定义比较器将流收集到TreeSet中 - 代码日志