<meta charset="utf-8">
经常写JS的话对函数式编程应该不陌生,JS是天然支持函数式的,而在Java中,需要用一个接口来实现伪函数编程,类似下图
image.png image.png
而在写的过程中编译器报错,当在函数内部使用外部变量时必须使用final声明,具体的原因可以参考这篇文章https://blog.csdn.net/cuipengfei1/article/details/9153481
这是因为在Java中匿名接口不允许修改外部变量,设置成final是为了安全考虑(当然设置成final也不会影响一个类对内部的属性做get或set方法,只是避免这个类不会会更改)
简单来说,如果在内部可以修改外部变量,由于Java方法只有值传递没有引用传递,会导致对外部变量的修改不一定生效,造成数据不同步问题
而在C# 和Scala中是有引用传递机制的,所以可以修改外部变量也不会产生负担
在Java8中这种问题已经得到改善
image.png
例如在JAVA8环境下
image.png这种代码并不会编译报错
而在JAVA7环境中
image.png这种代码会编译报错
当然,对于ext = null这种修改引用的写法,JAVA7和JAVA8都会报错
网友评论