规避传入可变参数 由于 Lambda 表达式只接受 final 不可变参数,或没有 final 修饰的无修改参数。如 果希望传入的参数可修改,可以利用对象(容器对象不可变,但容器内容可变)解 决。
避免自定义函数式接口 为了减少代码中自定义函数式接口,可以利用 Java 提供的 4 个基本函数式接口: • Supplier (提供者):没有输入参数,返回一个 T 类型的值; • Consumer (消费者):接收一个 T 类型的参数,并且没有返回值; • Function<T,R>(函数):接收一个 T 类型的参数,返回一个 R 类型的值; • Predicate (断言):接收一个 T 类型的参数,返回一个 boolean 类型的值。 在包“java.util.function”中,Java 提供了大量的函数式接口,大家可以实际需求选 择使用。
解决延迟调用问题 尽量使用方法引用传递代替值传递,可以让方法在真正使用时才调用,避免一些不 必要的方法计算,我们称之为“延迟调用”。 在下面代码中,无论“localValue”是否为空,都将执行“getRemoteValue”方法 获取值。 那么,我们可以利用“Optional”的“orElseGet”方法实现延迟调用:
解决初始化计算问题 根据模板工厂设计模式,需要抽象出一个或多个方法,并实现一个固定的算法流程。 如果在算法流程中,循环地调用某一个方法,并且在这个方法中都要计算同一套参 数,就存在一个初始化计算问题——应该提前初始化这些参数。 如果这些参数固定(每个实现类都用这套参数),我们可以抽象出一个初始化参数 的虚方法,利用这个方法计算得出参数值,然后再把这些参数传入对应的方法。但 是,如果这些参数不固定(根据实现类不同而不同),就不能采用这个方法了。 这里,作者给出一个基于 Lambda 表达式(函数式编程)的解决方案。
解决类型推断冲突问题 有时候,重载的两个方法(方法名完全一致),为了区分是否有返回值,需要定义 两个不同的参数类型。如果,这两个参数类型是函数式接口,且这两个函数式接口 定义完全一致,在使用 Lambda 表达式时,就会出现类型推断冲突的问题。
简化常用的设计模式 在软件开发过程中,软件设计模式无处不在。通过函数式编程,减少了不必要接口 声明及类实现,能够让设计模式的运用更灵活。
优化多表达式条件语句 有时候,我们会判断很多条件,需求用&&(或||)连接多个条件表达式。 最完美的 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 可下载完整版
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。