oksice 2024-07-15 15:28 采纳率: 80%
浏览 4
已结题

如下对List<Map>过滤流的操作为什么得到的不是List<Map>而编译报错?

请教如下定义的方法为什么第三行用getIntValue就会编译报错“java: 不兼容的类型: java.lang.Object无法转换为java.util.List<java.util.Map>”

    public List<Map> getNewTree(List<Map> oldTree, Map params) {
        List<Map> orgTreeList = new ArrayList<>();
        List<Map> tempList = oldTree.stream().filter(item -> MapUtils.getLong(item, "tree_level").compareTo(6L) < 0 ).collect(Collectors.toList());
//        List<Map> tempList = oldTree.stream().filter(item -> MapUtils.getIntValue(item, "tree_level") <= 5 ).collect(Collectors.toList());
        tempList.stream().forEach(item -> {
            Map map = new HashMap<>(item);
            map.put("tree_type", "3");
            orgTreeList.add(map);
        });
        return orgTreeList;
    }

使用getLong编译通过

img

使用getIntValue编译报错

img

MapUtils是引入org.apache.commons.collections4包的工具类,其定义如下:

public static <K> int getIntValue(Map<? super K, ?> map, K key) {
        Integer integerObject = getInteger(map, key);
        return integerObject == null ? 0 : integerObject;
    }

public static <K> Long getLong(Map<? super K, ?> map, K key) {
        Number answer = getNumber(map, key);
        if (answer == null) {
            return null;
        } else {
            return answer instanceof Long ? (Long)answer : answer.longValue();
        }
    }
  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-07-15 15:28
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    在您提供的代码和问题描述中,编译错误的原因是因为在 filter 表达式中使用 MapUtils.getIntValue 方法时,没有正确地处理返回类型。MapUtils.getIntValue 返回的是 int 类型,而 filter 中的比较操作需要一个 Long 类型。这导致了类型不匹配的问题。

    解决步骤:

    1. 理解问题filter 期望的是一个返回布尔值的表达式,而在这个表达式中,您尝试使用 MapUtils.getIntValue 方法,它返回一个 int 类型,而 compareTo 方法需要一个 Long 类型的参数。

    2. 修改代码:您需要将 int 类型的返回值显式转换为 Long 类型,以便 compareTo 方法可以正确地使用它。

    3. 应用修改:以下是修改后的代码:

    public List<Map> getNewTree(List<Map> oldTree, Map params) {
        List<Map> orgTreeList = new ArrayList<>();
        // 使用 MapUtils.getIntValue 并显式转换为 Long 类型
        List<Map> tempList = oldTree.stream()
            .filter(item -> (long) MapUtils.getIntValue(item, "tree_level") < 6L)
            .collect(Collectors.toList());
        tempList.stream().forEach(item -> {
            Map map = new HashMap<>(item);
            map.put("tree_type", "3");
            orgTreeList.add(map);
        });
        return orgTreeList;
    }
    
    1. 重新编译:应用上述修改后,代码应该能够通过编译。

    2. 测试代码:确保修改后的代码逻辑正确,并且能够按照预期工作。

    额外说明:

    • filter 表达式中,显式地将 int 类型的值转换为 Long 类型是必要的,因为 compareTo 方法需要一个 Long 类型的参数。
    • 确保 MapUtils.getIntValue 方法能够正确地从 Map 中获取 int 类型的值,并且在 filter 表达式中正确地使用这个值。

    通过这些步骤,您应该能够解决编译错误,并使代码正常工作。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 8月3日
  • 已采纳回答 7月26日
  • 创建了问题 7月15日

悬赏问题

  • ¥15 单片机stm32f10x编写光敏电阻调节3.3伏大功率灯亮度(光强越大灯越暗,白天正常光强灯不亮,使用ADC,PWM等模块)望各位找一下错误或者提供一个可实现功能的代码
  • ¥20 verilog状态机方法流水灯
  • ¥15 pandas代码实现不了意图
  • ¥15 GD32H7 从存储器到外设SPI传输数据无法重复启用DMA
  • ¥25 LT码在高斯信道下的误码率仿真
  • ¥45 渲染完成之后将物体的材质贴图改变,自动化进行这个操作
  • ¥15 yolov5目标检测并显示目标出现的时间或视频帧
  • ¥15 电视版的优酷可以设置电影连续播放吗?
  • ¥50 复现论文;matlab代码编写
  • ¥30 echarts 3d地图怎么实现一进来页面散点数据和卡片一起轮播