Javaの8ストリームでは、どのように列挙型の有効な値ではない文字列をフィルタするには?

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());

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=477341&siteId=1