开发者社区> 问答> 正文

Java 8 Lambda限制:报错

Lambda 表达式使用需要注意什么?

展开
收起
游客lmkkns5ck6auu 2022-10-26 21:34:58 419 0
1 条回答
写回答
取消 提交回答
    1. 规避传入可变参数 由于 Lambda 表达式只接受 final 不可变参数,或没有 final 修饰的无修改参数。如 果希望传入的参数可修改,可以利用对象(容器对象不可变,但容器内容可变)解 决。

    2. 避免自定义函数式接口 为了减少代码中自定义函数式接口,可以利用 Java 提供的 4 个基本函数式接口: • Supplier (提供者):没有输入参数,返回一个 T 类型的值; • Consumer (消费者):接收一个 T 类型的参数,并且没有返回值; • Function<T,R>(函数):接收一个 T 类型的参数,返回一个 R 类型的值; • Predicate (断言):接收一个 T 类型的参数,返回一个 boolean 类型的值。 在包“java.util.function”中,Java 提供了大量的函数式接口,大家可以实际需求选 择使用。

    3. 解决延迟调用问题 尽量使用方法引用传递代替值传递,可以让方法在真正使用时才调用,避免一些不 必要的方法计算,我们称之为“延迟调用”。 在下面代码中,无论“localValue”是否为空,都将执行“getRemoteValue”方法 获取值。 那么,我们可以利用“Optional”的“orElseGet”方法实现延迟调用:

    4. 解决初始化计算问题 根据模板工厂设计模式,需要抽象出一个或多个方法,并实现一个固定的算法流程。 如果在算法流程中,循环地调用某一个方法,并且在这个方法中都要计算同一套参 数,就存在一个初始化计算问题——应该提前初始化这些参数。 如果这些参数固定(每个实现类都用这套参数),我们可以抽象出一个初始化参数 的虚方法,利用这个方法计算得出参数值,然后再把这些参数传入对应的方法。但 是,如果这些参数不固定(根据实现类不同而不同),就不能采用这个方法了。 这里,作者给出一个基于 Lambda 表达式(函数式编程)的解决方案。

    5. 解决类型推断冲突问题 有时候,重载的两个方法(方法名完全一致),为了区分是否有返回值,需要定义 两个不同的参数类型。如果,这两个参数类型是函数式接口,且这两个函数式接口 定义完全一致,在使用 Lambda 表达式时,就会出现类型推断冲突的问题。

    6. 简化常用的设计模式 在软件开发过程中,软件设计模式无处不在。通过函数式编程,减少了不必要接口 声明及类实现,能够让设计模式的运用更灵活。

    7. 优化多表达式条件语句 有时候,我们会判断很多条件,需求用&&(或||)连接多个条件表达式。 最完美的 Lambda 表达式只有一行 409 通过 SonarLint 插件扫描,会存在 2 个复杂度问题: • Expressions should not be too complex(表达式不能太复杂); • Methods should not be too complex(方法不能太复杂)。 这里,可以采用 Lambda 表达式进行优化,降低代码复杂度并避免上述问题。

    以上内容摘自《Java工程师必读手册》电子书,点击https://developer.aliyun.com/ebook/download/7780 可下载完整版

    2022-10-26 22:30:56
    赞同 展开评论 打赏
来源圈子
更多
收录在圈子:
阿里云开发者社区官方技术圈,用户产品功能发布、用户反馈收集等。
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载