【问题标题】:Immutable Collection Treated as Mutable. Cannot use Collections.max不可变集合被视为可变集合。无法使用 Collections.max
【发布时间】:2021-01-12 23:15:38
【问题描述】:

我正在使用 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 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!>?),Comparator!>!) ((MutableCollection..Collection?),Comparator!) 可以应用于 (List!>,CompareSizesByArea)

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

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

问题是输出尺寸图??

【问题讨论】:

  • 你试过 .maxBy 吗?
  • 是的,供将来参考,maxBy 是一个东西,我总是需要提醒自己“为什么max 不处理这个Comparable??”十分钟

标签: kotlin collections android-camera android-camera2


【解决方案1】:

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 }

【讨论】:

  • 很好的解释!现在正在工作。谢谢
猜你喜欢
  • 2012-01-19
  • 2011-03-11
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
相关资源
最近更新 更多