マーク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を定義するが、ストリーム・パイプラインは通常ありません。