不可变集合被视为可变无法使用Collections.max

问题描述

我正在使用Camera2 API,并且正在尝试检索最大的可用图像尺寸。我想使用Collections.max。我试图用Java编写此代码,并且效果很好。

JAVA Ex-

Cameracharacteristics characteristics
                    = manager.getCameracharacteristics(cameraId);

            // We don't use a front facing camera in this sample.
            Integer facing = characteristics.get(Cameracharacteristics.LENS_FACING);
            if (facing != null && facing == Cameracharacteristics.LENS_FACING_FRONT) {
                continue;
            }

            StreamConfigurationMap map = characteristics.get(
                    Cameracharacteristics.SCALER_STREAM_CONfigURATION_MAP);
            if (map == null) {
                continue;
            }

            // For still image captures,we use the largest available size.
            Size largest = Collections.max(
                    Arrays.asList(map.getoutputSizes(ImageFormat.JPEG)),new CompareSizesByArea());

但是,等效于Kotlin的Collections.max操作存在问题。

科特琳Ex-

val characteristics = manager.getCameracharacteristics(cameraId)

                val map = characteristics.get(
                    Cameracharacteristics.SCALER_STREAM_CONfigURATION_MAP
                ) ?: continue

    // for still image captures,we use the largest available size
                    val largest = Collections.max(
                        listof(map.getoutputSizes(ImageFormat.JPEG)),CompareSizesByArea()
                    )

错误提示

以下任何替换项(((MutableCollection !> .. Collection !>?),比较器!>!)((MutableCollection .. Collection ?),Comparator !)可以应用于 (列表!>,CompareSizesByArea)

我不确定如何更正我的代码。我可以在其他实例中使用Collections.max,例如

val test = listof(1,2,3,4,1)
Collections.max(test)

问题在于输出尺寸图?

解决方法

如您在Java代码中所使用的,

Arrays.asList()将数组转换为List。所以你有一个List<Size>

如您在Kotlin代码中所使用的,

listOf()将创建传递给它的项目的列表。在这种情况下,您将一个项目传递给它,即数组。因此,您正在创建一个List<Array<Size>>,其中只有一个对象,即大小数组。

在Kotlin中执行Arrays.asList()的等效方法是简单地在数组上调用.asList()

val largest = Collections.max(
        map.getOutputSizes(ImageFormat.JPEG).asList(),CompareSizesByArea()
    )

但是,如果您要纯粹在Kotlin中进行此操作,则可以跳过Collections函数,并更简单地执行此操作:

val largest = map.getOutputSizes(ImageFormat.JPEG).maxBy { it.width * it.height }