函数闭包-Go&Java

-目录-

函数闭包概念

闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)。 在本质上,闭包是将函数内部和函数外部连接起来的桥梁,通过它可以修改函数的内部的变量。

闭包实现

在Go里,使用匿名函数实现。可见内部匿名函数被推出到外部后,就可以改变内部值。

package main

import "fmt"

// 实现斐波那契数列
func fibonacci() func() int {
	a:=0
	b:=1
	return func() int {
		temp:=b
		b=a+b
		a=temp
		return a
	}
}

func main() {
	f := fibonacci()
	for i := 0; i < 10; i++ {
		fmt.Println(f())
	}
}
// 输出1 1 2 3 5 ...

////非闭包实现
//import "fmt"
//
//func main() {
//	a:=1
//	b:=1
//	for i := 0; i < 10 ;i++{
//		fmt.Println(a)
//		temp:=b
//		b=a+b
//		a=temp
//	}
//}

JAVA里的闭包,可以用匿名内部类实现。但是和Go不一样。

public class TestC {
    public static void main(String[] args) {
        Inner inner = new TestC().addA();
        System.out.println(inner.add(3));
    }

    Inner addA() {
        int a = 1;
        int b = 1;
        return new Inner() {
            // 可以获取原函数内的变量但不可读取
            // 这是和Go不同的地方
            // a = 3;是错的
            @Override
            public int add(int c) {
                return a + b + c;
            }
        };
    }
}

interface Inner {
    int add(int c);
}
© 2019 - 2023 · YuYoung's Blog