コードの重複を避けるための新しい方法への代替

マークSholund:

私は別のストリームに同じ操作を適用したいと思います(現時点でのJava 8を使用して)

背景:私はティカの外寸法データを取得しようとしていますメタデータオブジェクト

以下の作品が、繰り返しコード(メタデータはティカであるメタデータオブジェクト):

    private static void processDimensions(final Metadata metadata) {
        Optional<Integer> optWidth = Arrays.stream(new String[] {"tiff:ImageWidth", "Image Width"})
                .map(metadata::get)
                .filter(Objects::nonNull)
                .map(v -> v.replace("pixels", ""))
                .map(Integer::parseInt).findFirst();
        // do something with optWidth

        Optional<Integer> optHeight = Arrays.stream(new String[] {"tiff:ImageLength", "Image Height"})
                .map(metadata::get)
                .filter(Objects::nonNull)
                .map(v -> v.replace("pixels", ""))
                .map(Integer::parseInt).findFirst();
        // do something with optHeight
    }

私は繰り返しませんコードを実行し、このポイントに得ています:

    private static void processDimensions(final Metadata metadata) {
        Optional<Integer> optWidth = processDimension(metadata, "tiff:ImageWidth", "Image Width");
        // do something with optWidth

        Optional<Integer> optHeight = processDimension(metadata, "tiff:ImageLength", "Image Height");
        // do something with optHeight
    }

    private static Optional<Integer> processDimension(final Metadata metadata, @NonNull final String... keys) {
        return Arrays.stream(keys).map(metadata::get).filter(Objects::nonNull).map(v -> v.replace("pixels", ""))
                .map(Integer::parseInt).findFirst();
    }

こうした内部の関数としての別のメソッドずに、これと同じことを行うすることが可能です)processDimensions( どのように見てはでしょうか?

ラビンドラRanwala:

はいとして宣言java.util.Functionし、それを再利用します。

Function<String[], OptionalInt> funct = keys -> Arrays.stream(keys)
    .map(metadata::get)
    .filter(Objects::nonNull)
    .map(v -> v.replace("pixels", ""))
    .mapToInt(Integer::parseInt)
    .findFirst();

ここでは、あなたがそれを呼び出す方法です。

funct.apply(strArr);

実際には、メソッドを宣言するようなはるかに読みやすい名前を与えるprocessDimensionsので、それははるかに読みやすい私にあり、そしてあなたは、ラムダより説明的な名前を持つパラメータ型を宣言します。あなたがよくストリームに精通していない限り、あなたは、このパイプラインを読んで苦労を見つけることができます。また、この方法は、事実上のAPIを定義するが、ストリーム・パイプラインは通常ありません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=3972&siteId=1