[解決済み] ストリームを使用してカスタムコンパレータでTreeSetに収集する
2022-10-10 17:36:31
質問
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
はある値より古いです。しかし、これを表現するための正しい 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))
)
);
しかし、これはコンパイルできませんし、メソッド参照のための有効な構文でもないように見えます。
どのように解決するのですか?
メソッド参照は、満たそうとしている対象の形状に合ったメソッド(またはコンストラクタ)がある場合に使うことができます。この場合、メソッド参照を使うことはできません。なぜなら、対象としている形状は
Supplier
で、これは引数を取らないのですが、あなたが持っているのは
TreeSet
のコンストラクタは引数を取りますが、その引数が何であるかを指定する必要があります。そのため、あまり簡潔ではないアプローチをとって、ラムダ式を使用する必要があります。
TreeSet<Report> toTreeSet(Collection<Report> reports, long timestamp) {
return reports.stream().filter(report -> report.timestamp() >= timestamp).collect(
Collectors.toCollection(
() -> new TreeSet<>(Comparator.comparingLong(Report::timestamp))
)
);
}
関連
-
mvn' は、内部または外部のコマンド、操作可能なプログラムまたはバッチファイルとして認識されません。
-
NullPointerException - java.lang.
-
春ブート複数のデータソースの管理(atomikos)同じサーバーホスト上の複数のプロジェクトを開始する複数のJava - jarのエラーソリューション
-
[解決済み] Mavenを使用して、依存関係を持つ実行可能なJARを作成するにはどうすればよいですか?
-
[解決済み] javaストリームで整数のリストを合計する方法は?
-
[解決済み] Java 8のインターフェイスメソッドで "final "が使えないのはなぜですか?
-
[解決済み】ストリームを使った地図作成で重複を無視する。
-
[解決済み】Java 8のOptionalをStream::flatMapで使用する。
-
[解決済み] Java 8でStreamをキャストすることは可能ですか?
-
[解決済み] Java enumとpublic static finalフィールドを持つクラスとでは、どのような利点がありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
NullPointerException - java.lang.
-
アクセス制限です。タイプ 'Application' は API ではない(必要なライブラリに制限がある)。
-
型に解決できない エラー解決
-
無効なメソッド宣言
-
java -jarコマンドでパッケージを実行すると、無効または破損したjarfile xxxx.jarが表示される。
-
SocketException java.netの4つの例外解決策。
-
keytool error: java.io.FileNotFoundException: cacerts (アクセス拒否されました。)
-
Junitのユニットテストエラー
-
Server Tomcat v9.0 Server at localhost の起動に失敗しました。
-
linux ant Resolve error: main class not found or couldn't be loaded org.apache.tools.ant.launcher.