数组长度的好 lambda?

Ole*_*.V. -3 java arrays lambda

数组长度是否有优雅的 lambda?类似于方法引用的东西,而不是方法?Arraylength更像是一个公共的 final 字段。

从一个锯齿状的二维数组 ( Object[][]) 我想找到最长的内部数组。这很容易:

    OptionalInt width = Stream.of(myJaggedArray).mapToInt(line -> line.length).max();
Run Code Online (Sandbox Code Playgroud)

我只是想知道当我找不到比line -> line.length. 我原以为Object[]::length可能会起作用,但它给出了“类型 Object[] 没有定义适用于此处的长度(Object[])”。我在网上搜索过,但没有找到替代方法。

我可以用我所拥有的快乐生活。也许这只是由不是来自方法的长度引起的数组的特殊之处。认为值得一问。

Lyu*_*riv 7

总结除了我对缩短 lambda 参数名称和使用静态方法引用的评论之外,我总共会给出四种解决方案:

缩短 lambda 参数名称

这是我能想到的最直接、最自然的方式,你可能会坚持下去,因为它没有错:

Stream.of(myJaggedArray).mapToInt(l -> l.length).max()
Run Code Online (Sandbox Code Playgroud)

我不认为您会喜欢下面的任何解决方案,但让它们全部包含在集合中。

使用数组长度静态方法参考

Stream.of(myJaggedArray).mapToInt(ArrayLength::length).max()
Run Code Online (Sandbox Code Playgroud)

哪里ArrayLength#length很简单:

private static <T> int length(final T[] array) {
    return array.length;
}
Run Code Online (Sandbox Code Playgroud)

创建一个简单的数组包装器以与方法引用对齐

由于length属性在 Java 中不是真正的字段,而且绝对不是方法,因此您可能还想将数组包装到一个简单的包装器中(使用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() { ... }

}
Run Code Online (Sandbox Code Playgroud)

因此你可以这样写:

Stream.of(wrap(myJaggedArray)).mapToInt(ArrayWrapper::length).max()
Run Code Online (Sandbox Code Playgroud)

你自己的流工厂方法来产生一个流 ArrayWrapper<T>

流工厂方法可能会封装ArrayWrapper#wrap方法本身:

StreamWrapper.of(myJaggedArray).mapToInt(ArrayWrapper::length).max()
Run Code Online (Sandbox Code Playgroud)

然后在StreamWrapper

public static <T> Stream<ArrayWrapper<T>> of(final T[] array) {
    return Stream.of(ArrayWrapper.wrap(array));
}
Run Code Online (Sandbox Code Playgroud)

我不推荐后三种解决方案,让它们只是示例解决方法。

你的 lambda 表达式line -> line.length非常好,非常地道。