首页 > 解决方案 > 不可变集合被视为可变集合。无法使用 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操作存在问题。

Kotlin 前

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<out Array<(out) Size!>!>..Collection<Array<(out) Size!>!>?),Comparator<in Array<(out) Size!>!> !) ((MutableCollection<out Size!>..Collection<Size!>?),Comparator<in Size!>!) 可以应用于 (List<Array<(out) Size!>!>,CompareSizesByArea)

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

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

问题是输出大小的地图?

标签: kotlincollectionsandroid-cameraandroid-camera2

解决方案


Arrays.asList(),正如您在 Java 代码中使用的那样,将数组转换为List. 所以你有一个List<Size>.

listOf(),正如您在 Kotlin 代码中使用的那样,创建您传递给它的项目的列表。在这种情况下,您将一个项目传递给它,一个数组。因此,您正在创建一个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 }

推荐阅读