Comparator.reversed()颠倒排序时,使用lambda报错 您所在的位置:网站首页 java比较器comparator报错 Comparator.reversed()颠倒排序时,使用lambda报错

Comparator.reversed()颠倒排序时,使用lambda报错

2023-12-24 00:05| 来源: 网络整理| 查看: 265

目的:对list中元素的属性做操作之后进行颠倒排序,使用lambda表达式报错,

提示:Cannot resolve method 'getContributionProportion' in 'Object' 

场景:

首先,获取到list,然后对list中的元素根据某个属性进行某些操作之后排序,使用lambda表达式会报错,如下,会提示Cannot resolve method 'getContributionProportion' in 'Object'。

1、使用lambda表达式,进行排序,会报错

1、List list = employeeService.listByIds(idList); list.sort(Comparator.comparing(o -> new BigDecimal(o.getContributionProportion())).reversed()); 2、不使用lambda表达式时,直接使用方法引用,不会报错,但是没有达到需求 2、list.sort(Comparator.comparing(Employee::getContributionProportion).reversed());

3、使用lambda表达式,不进行颠倒排序,也不会报错,但是也没有达到需求

3、list.sort(Comparator.comparing(o -> new BigDecimal(o.getContributionProportion())));

4、正确的写法:

4、list.sort(Comparator.comparing((Employee o) -> new BigDecimal(o.getContributionProportion())).reversed());

        如果不使用方法引用,要传递一些其他的参数,使用lambda表达式时,这个时候,可以在lambda中显示提供参数类型。

        当然,如果不是这样的写法,分开来处理,也是可以多种方式实现业务需求的,现在只是针对这种方式讲一下是为什么会报错。

先简单了解一下lambda表达式:

        Lambda 表达式中的参数类型都是由编译器推断得出的。 Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。 Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的 “类型推断”。Lambda表达式会有类型检查和类型推断这两个过程,保证了Lambda使用的正确性。

类型检查:主要就是检查Lambda表达式是否能正确匹配函数式接口的方法。

类型推断:当Lambda表达式没有显式声明参数类型,JVM编译器会通过目标类型推断入参类型。

Lambda的上下文:使用Lambda表达式来传递的方法的参数,或接受Lambda表达式的值的局部变量        

目标类型:是指Lambda表达式所在上下文环境的类型。比如,将 Lambda 表达式赋值给一个局部变量,或传递给一个方法作为参数,局部变量或方法参数的类型就是 Lambda 表达式的目标类型。

第一种分析:

        sort()的参数是Comparator



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有