ラムダパラメータ名を短縮し、静的メソッドのリファレンスを使用しての私のコメントに加えて、最大まとめると、私は全部で4種類の溶液を与えるだろう-forwardと自然な方法は、私が考えることができ、それはそれで間違って何もないと、あなたはおそらくそれに固執します:
Stream.of(myJaggedArray).mapToInt(l -> l.length).max()
私はあなたが以下のソリューションのいずれかをたいとは思わないが、しかし、彼らはなりましょうコレクションのすべて。配列の長さ静的メソッド参照ArrayLength#length
は非常に簡単である
Stream.of(myJaggedArray).mapToInt(ArrayLength::length).max()
使用
:length
性であるための方法に合わせて単純な配列ラッパーを作成
private static <T> int length(final T[] array) {
return array.length;
}
は
を参照しますJavaの実際のフィールドではなく、それは間違いなくメソッドではなく、単純なwに配列をラップすることもできますラッパー(ちょうどT
を使用して8つのプリミティブラッパー実装に膨らんでいない)。
public final class ArrayWrapper<T> {
private final T[] array;
private ArrayWrapper(final T[] array) { this.array = array; }
public static <T> ArrayWrapper<T> wrap(final T[] array) { return new ArrayWrapper<>(array); }
public T get(int i) { return array[i]; }
public void set(final int i, final T e) { array[i] = e; }
public int length() { return array.length; }
@Override
public boolean equals(final Object o) { ... }
@Override
public int hashCode() { ... }
}
このようにあなたがして書き込むことができます。
Stream.of(wrap(myJaggedArray)).mapToInt(ArrayWrapper::length).max()
をストリームファクトリメソッドは、ArrayWrapper#wrap
方法自体カプセル化かもしれないArrayWrapper<T>
のストリームを生成するために、独自のストリームファクトリメソッド:
StreamWrapper.of(myJaggedArray).mapToInt(ArrayWrapper::length).max()
を
そして、StreamWrapper
:
public static <T> Stream<ArrayWrapper<T>> of(final T[] array) {
return Stream.of(ArrayWrapper.wrap(array));
}
私は後者の3つの解決策のどれも推奨せず、それらを単に回避策の例にすることをお勧めします。
ラムダ式line -> line.length
は、本当にうまく、実際には慣用です。
私の場合、あなたのアプローチはエレガントです –
かなりエレガントできれいに見えます。よくやった。 – duffymo
特別なことは何もありません... Javaではフィールド参照がありません。 –