workerjoe:
私が持っている列挙 IコールPermission
セキュリティ権限の私のアプリケーションに問題のことを。データベースでは、ユーザーが自分のアプリケーションに関連していない追加の権限を有することができます。データベースからユーザーを読んだとき、私は得るList<String>
と私が構築したいList<Permission>
列挙型の値ではありませんそれらの文字列を無視して、。
public enum Permission { ADMIN, USER }
List<String> plaintextAuthorities = List.of("ADMIN","USER","COFFEEMAKER")
List<Permission> appPermissions = plaintextAuthorities.stream()
.map(Permission::valueOf) // this will throw an IllegalArgumentException for 'COFFEEMAKER'
.collect(Collectors.toList());
問題があるということmap
、それが列挙型の値に対応していない文字列のいずれかに達したときにステップが例外をスローします。どうやってできfilter
て、それらの値ので、彼らは静かに例外をスローせずに無視されていますか?
ラビンドラRanwala:
あなたは最初のエンコードできるPermission
にenum定数をSet
文字列の、その後、あなたにそれを使用filter
無効な値をフィルタリングする述語。次に使用.map
のみ有効な値のために戻って文字列表現からenum定数をデコードするオペレータを。ここではそれがどのように見えるのです。
Set<String> strPermissionSet = Arrays.stream(Permission.values())
.map(Permission::name)
.collect(Collectors.toSet());
Set<Permission> appPermissions = plaintextAuthorities.stream()
.filter(strPermissionSet::contains)
.map(Permission::valueOf)
.collect(Collectors.toSet());
それでも、あなたは名前の静的メソッド宣言オフ最高ですisValid
文字列値与えられたユーザーは、それが有効な列挙型定数を表しているか否かをチェックできるように、列挙型では。ここではそれがどのように見えるのです。
public enum Permission {
ADMIN, USER;
private static final Set<String> strPermissions =
Arrays.stream(values())
.map(Permission::name)
.collect(Collectors.toSet());
public static boolean isValid(String val) {
return strPermissions.contains(val);
}
}
そして今、あなたのクライアントコードは次のようになります。
Set<Permission> appPermissions = plaintextAuthorities.stream()
.filter(Permission::isValid)
.map(Permission::valueOf)
.collect(Collectors.toSet());