[解決済み】Javaストリームを1つの要素だけにフィルタリングする
2022-03-31 16:20:42
質問
Java 8を使おうとしています
Stream
の中にある要素を見つけるために
LinkedList
. しかし、私は、フィルタ条件に一致するものが1つだけであることを保証したいと思います。
このコードを見てください。
public static void main(String[] args) {
LinkedList<User> users = new LinkedList<>();
users.add(new User(1, "User1"));
users.add(new User(2, "User2"));
users.add(new User(3, "User3"));
User match = users.stream().filter((user) -> user.getId() == 1).findAny().get();
System.out.println(match.toString());
}
static class User {
@Override
public String toString() {
return id + " - " + username;
}
int id;
String username;
public User() {
}
public User(int id, String username) {
this.id = id;
this.username = username;
}
public void setUsername(String username) {
this.username = username;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public int getId() {
return id;
}
}
このコードでは
User
をそのIDを元に作成します。しかし、いくつの
User
がフィルタにマッチした。
フィルター行を変更する。
User match = users.stream().filter((user) -> user.getId() < 0).findAny().get();
を投げます。
NoSuchElementException
(良い!)
複数マッチした場合はエラーを投げるようにしてほしいのですが。そのような方法はありますか?
どのように解決するのですか?
カスタムを作成する
Collector
public static <T> Collector<T, ?, T> toSingleton() {
return Collectors.collectingAndThen(
Collectors.toList(),
list -> {
if (list.size() != 1) {
throw new IllegalStateException();
}
return list.get(0);
}
);
}
を使用します。
Collectors.collectingAndThen
を作成し、目的の
Collector
によって
-
オブジェクトを集めて
List
と共にCollectors.toList()
コレクターになります。 -
最後に追加のフィニッシャーを適用して、単一の要素を返すか、あるいは
IllegalStateException
もしlist.size != 1
.
として使用されます。
User resultUser = users.stream()
.filter(user -> user.getId() > 0)
.collect(toSingleton());
そして、これをカスタマイズすることができます。
Collector
例えばコンストラクタの引数として例外を与えたり、 値を 2 つ指定できるようにしたりと、好きなようにカスタマイズできます。
もう一つの解決策-間違いなく、よりエレガントではない-。
を含む「ワークアラウンド」を使用することができます。
peek()
と
AtomicInteger
しかし、本当はそれを使うべきではありません。
代わりにできることは、それを
List
のような、このような。
LinkedList<User> users = new LinkedList<>();
users.add(new User(1, "User1"));
users.add(new User(2, "User2"));
users.add(new User(3, "User3"));
List<User> resultUserList = users.stream()
.filter(user -> user.getId() == 1)
.collect(Collectors.toList());
if (resultUserList.size() != 1) {
throw new IllegalStateException();
}
User resultUser = resultUserList.get(0);
関連
-
[解決済み] double 型を Int 型に変換、切り捨て
-
[解決済み] java.util.MissingFormatArgumentException: 形式指定子 '%s' がありません。
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] Java 8 List<V> を Map<K, V> に変換する。
-
[解決済み] Java 8 StreamをArrayに変換する方法は?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] java.sql.SQLException: ORA-00933: SQL コマンドが正しく終了していません。
-
[解決済み] 未処理の例外タイプIOException」が表示されるのですが?
-
[解決済み] javaで部分クラスを実装する方法
-
[解決済み] 一部の入力ファイルが非推奨のAPIを使用またはオーバーライドしている
-
[解決済み] android.support.v4.app.FragmentActivity' で 'TAG' がプライベートアクセスされている。
-
[解決済み] java.lang.ClassNotFoundException: クラス com.ibm.db2.jcc.DB2Driver が Worklight プラットフォームまたはプロジェクトに見つかりませんでした。
-
[解決済み] Mavenです。JARは空になります - 含有するためにマークされたコンテンツがありません
-
[解決済み] SubclipseとJavaHLのインストールで頭を悩ます
-
[解決済み] java.sql.SQLRecoverableException: IO エラーです。NL Exceptionが発生しました
-
[解決済み] Spring ApplicationContext - リソースリーク: 'context' が閉じられない