1)函数式编程的优势和劣势分别是什么?
优势:
①不可变性
②并行操作
③执行顺序更灵活
④代码更加简洁
纯粹的函数式编程,变量具有不可变性,同一个参数不会在不同场景下得出不同的结果,因此大大增强了系统的稳定性。并行操作,与线程无关,提高了安全性。
以Lambda表达式为例,Lambda语法实现了类型自动推断,在方法引用时考虑参数类型和返回值即可。Lambda可作为参数传给函数、Lambda结合forEach,stream(),FunctionalInterface Lib的使用,简化了代码。函数可以被当做变量使用,比如,在用递归时,只关注表达式,即描述问题本身,而不是如何实现,代码更加接近自然语言。
劣势:
①消耗资源
②可能占用的空间会大些
③不易排查
以递归为例,其子问题的答案被重复计算,当输入的参数较大,程序可能会因创建过多的堆栈,产生溢出问题,此时要考虑尾递归优化。尾递归优化时还要考虑编译器、解释器的支持与否。这样一来,在得到便利的同时也加大了函数式编程的难度和异常维护的开销。
2)Stream流的哪一个方法最有价值,为什么》
Java 8引入了全新的Stream API。
Stream提供许多实用的功能,不同的方法有不同的用处,转换操作(map、filter、sorted、distinct)、合并操作(concat、flatMap)、并行处理(parallel)、聚合操作(reduce、count、max、min、sum、average)、其他操作(allMatch、forEach)等。
个人认为,Stream的价值不止于它的某一个方法在日常开发中被用到次数的多少来决定的,而是它的设计使得返回结果依然是一个Stream。因为是Stream,可以利用它去进行内存计算;因为是Stream,可以利用它的惰性计算去处理诸多复杂问题。因为是Stream,Lambda在与Stream的结合使用中,让代码更加简洁。