Comparator.reversed()颠倒排序时,使用lambda报错 | 您所在的位置:网站首页 › java比较器comparator报错 › Comparator.reversed()颠倒排序时,使用lambda报错 |
目的:对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 实验室设备网 版权所有 |