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[])”。我在网上搜索过,但没有找到替代方法。
我可以用我所拥有的快乐生活。也许这只是由不是来自方法的长度引起的数组的特殊之处。认为值得一问。
总结除了我对缩短 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非常好,非常地道。
| 归档时间: |
|
| 查看次数: |
1111 次 |
| 最近记录: |