首页 > 编程知识 正文

distributeddataparallel,pythonlambda详解

时间:2023-05-04 04:48:29 阅读:111921 作者:4251

目的:操作列表中元素的属性,然后按相反顺序排序,并使用lambda表达式报告错误。

提示: cannotresolvemethod ' getcontributionproportion ' in ' object '

listemployeelist=employeeservice.listbyids (idlist;

1、list.sort (comparator.com paring (o-new bigdecimal ) o.getcontributionproportion () )、reversed ) ); 如果不使用lambda表达式,则接受方法引用,不报告错误,但要求2,list.sort(comparator.comparing ) employee :3360 getcontributionpropoport

3、list.sort (comparator.com paring (o-new bigdecimal ) o.getcontributionproportion () ) ) ) )书写正确:

4、list.sort(comparator.comparing () employeeo )-new bigdecimal (o.getcontribution proportion ) () )、revevee

当然,如果不是这种写法的话,可以通过分开处理,用各种各样的方法来实现业务需求。 现在,我只是在说关于这个方法为什么会出错。

首先,简单说明lambda公式。

Lambda表达式的参数类型由编译器估计。 无需在Lambda表达式中指定类型,也可以编译程序。 这是因为javac根据程序上下文在后台估计参数类型。 Lambda表达式的类型取决于上下文环境,由编译器估计。 这就是所谓的“类型估计”。 Lambda表达式有两个过程:类型检查和类型估计,保证了Lambda使用的正确性。

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

如果未在33558www.Sina.com/lambda表达式中显式声明参数类型,JVM编译器将根据目标类型估计参数类型。

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

目标类型Lambda表达式所在的上下文环境的类型。 例如,将Lambda表达式分配给局部变量,或作为参数传递给方法。 局部变量或方法参数的类型为Lambda表达式的目标类型。

类型推断:

sort ()的参数是Comparator吗? 在对super E c (这里是list )进行排序时,此时的e根据前面的list估计为Employee类型,该参数也必须是这种类型,list.sort ) )要传递的参数是Comparator super Employee c (即Comparator.comparing ()应返回的类型是ComparatorEmployee,即Comparator.comparing ) )是函数为employyon

因为指定了2、4型,所以不需要进行类型推断,一定可以编译。

为什么可以消除reversed ()进行编译? Comparator.comparing ()没有指定特定的常规参数,因此也可以通过在方法调用之前使用指定或向方法传递特定类型的条目来估计编译器。 否则,缺省为sort ) )根据条目类型估计,此处缺省为sort ) )的条目类型估计为Employee。

        1为什么编译失败?reversed()的返回类型依赖前一个方法的返回类型推断,Comparator.comparing()又依赖它的入参Function<? super T, ? extends U> keyExtractor推断,但是它的入参没有明确的类型,那么它只能直接推断成最顶级的类型,即Object类型。这里为什么没有默认从sort()入参类型里推断呢?注意,这里的比较器是多层的,comparing()和reversed(),最终我们需要的比较器是reversed()返回的,因为编译器的类型推断机制不够强大,无法同时采取两个步骤,推断不出来类型,也就是无法从上下文中推断出类型。个人的理解,lambda表达式要推断类型的时候,如果是一层操作,可以根据上下文推断出来,如果是多层操作则推断不出来,变成多个上下文,而reversed()是后操作的,是离lambda表达式最近的上下文,两层上下文,参数是未知的,就变成object,lambda推断的就是object。

第二种分析:

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

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

        再来对比一下这两种写法,o -> new BigDecimal(o.getContributionProportion())看成一个整体。

第一种写法:推断类型的时候,根据目标类型推断,也就是根据Comparator.comparing()的参数类型推断,因为comparing()的参数类型和返回类型是一个类型,这里只有一个comparing()操作,且sort()需要Employee类型,即comparing()需要返回Employee类型,综合,推断o类型是Employee;

第二种写法:整体看,sort()需要Employee类型,也就是原本需要Comparator.comparing(o -> new BigDecimal(o.getContributionProportion())).reversed()返回一个Employee类型,由于这里有两个操作,最终返回Employee类型,所以编译器推断的时候并不确定comparing()的参数传的就是Employee类型,所以推断成它的父类Object,因此就推断了o类型是Object类型,而sort()不需要Object类型,所以报错。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。