java函数式编程--柯里化(Currying),闭包 - 来碗板面
- public class Closure {
- public String version="";
- public static void main(String[] args) {
- Closure c1=new Closure();
- c1.version="1.0";
- Moment m1=c1.getMoment();
- System.out.println(m1.getVersion());
- c1.version="2.0";
- Moment m2=c1.getMoment();
- System.out.println(m2.getVersion());
- }
- public Moment getMoment(){
- return new Moment() {
- @Override
- public String getVersion() {
- return version;
- }
- };
- }
- }
- interface Moment{
- String getVersion();
- }
以上分别输出1.0 2.0,说明m1,m2记住了当时的状态,也就是说每次声明Moment对象的时候,编译器会把相关的值拷贝副本,放到对象的私有变量里。
return function(y){
return num + y;
}
}
java中缺少动态类型,又缺少类似于Prototype的原型,我们只能通过一些其他特性来弥补。
- public class keli {
- public calculator changeCalc(final initialize init, final int num) {
- return new calculator() {
- @Override
- public int cal(int addend) {
- return init.init(num) + addend;
- }
- };
- }
- public static void main(String[] args) {
- initialize init1 = new initialize() {
- @Override
- public int init(int num) {
- num = num * 10;
- return num;
- }
- };
- initialize init2 = new init2();
- calculator clac1=new keli().changeCalc(init1,3);
- calculator clac2=new keli().changeCalc(init2,3);
- System.out.println(clac1.cal(2));
- System.out.println(clac2.cal(2));
- }
- }
- class init2 implements initialize{
- @Override
- public int init(int num) {
- num = num / 10;
- return num;
- }
- }
- interface calculator {
- int cal(int num);
- }
- interface initialize {
- int init(int num);
- }
注意:在JDK7以下需要加final关键字来固定住函数参数(JDK8不用加,编译器内部帮我们加了)。
- public class currying3 implements Proto {
- public List<String> paramList = null;
- public currying3(List<String> paramList) {
- this.paramList = paramList;
- }
- @Override
- public List<String> getList() {
- return this.paramList;
- }
- public static void main(String[] args) {
- List<String> paramList = new ArrayList<String>();
- Proto p = new currying3(paramList);
//延迟计算结果,当参数为空时计算- p.handle("aa").handle("bb").handle("cc").handle();
- System.out.println("end.....");
- List<String> paramList1 = new ArrayList<String>();
- Proto p1 = new currying3(paramList1);
- p1.handle("dd").handle("ee").handle("ff").handle();
- System.out.println("end.....");
- }
- }
- interface Proto {
- public List<String> getList();
- default Proto handle(String... param) {
- List<String> paramList=this.getList();
- if (param == null || param.length <= 0) {
- for (String Str : paramList) {
- System.out.println(Str);
- }
- return null;
- } else {
- for (String Str : param) {
- paramList.add(Str);
- }
- return this;
- }
- }
- }
bb
cc
end…..
dd
ee
ff
end…..