2016-10-28 4 views
0

配列の長さにエレガントなラムダがありますか?メソッド参照のようなものですが、メソッドのためだけではありませんか?配列lengthは、最終的な最終フィールドによく似ています。配列の長さに良いラムダ?

ギザギザの2D配列(Object[][])から、私は最も長い内部配列を探したいと思っていました。それは十分に簡単です:

OptionalInt width = Stream.of(myJaggedArray).mapToInt(line -> line.length).max(); 

私はline -> line.lengthより良いを見つけることができないとき、私は何かが欠けていた場合、私はちょうど思ったんだけど。私はObject[]::lengthが機能するかもしれないと思っていましたが、 "Object []型はここで適用可能なlength(Object [])を定義しません"。私は代替手段を見つけることなくウェブを検索しました。

私は自分が持っているもので幸せに暮らすことができます。たぶん、メソッドから来ていない長さによって引き起こされる配列のための特別なものです。聞く価値があると思った。

これが最もストレートでラムダパラメータ名

を短縮:

+1

私の場合、あなたのアプローチはエレガントです –

+1

かなりエレガントできれいに見えます。よくやった。 – duffymo

+1

特別なことは何もありません... Javaではフィールド参照がありません。 –

答えて

3

ラムダパラメータ名を短縮し、静的メソッドのリファレンスを使用しての私のコメントに加えて、最大まとめると、私は全部で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は、本当にうまく、実際には慣用です。