美文网首页
四、Lambda 访问外部变量及接口默认方法

四、Lambda 访问外部变量及接口默认方法

作者: 寂静的春天1988 | 来源:发表于2019-05-09 16:13 被阅读0次
一、访问局部变量

在 Lambda 表达式中,我们可以访问外部的 final 类型变量,如下面的示例代码:

// 转换器
@FunctionalInterface
interface Converter<F, T> {
    T convert(F from);
}
final int num = 1;
Converter<Integer, String> stringConverter =
        (from) -> String.valueOf(from + num);

stringConverter.convert(2);     // 3

与匿名内部类不同的是,我们不必显式声明 num 变量为 final 类型,下面这段代码同样有效:

int num = 1;
Converter<Integer, String> stringConverter =
        (from) -> String.valueOf(from + num);

stringConverter.convert(2);     // 3

但是 num 变量必须为隐式的 final 类型,何为隐式的 final 呢?就是说到编译期为止,num 对象是不能被改变的,如下面这段代码,就不能被编译通过:

int num = 1;
Converter<Integer, String> stringConverter =
        (from) -> String.valueOf(from + num);
num = 3;

在 lambda 表达式内部改变 num 值同样编译不通过,需要注意, 比如下面的示例代码:

int num = 1;
Converter<Integer, String> converter = (from) -> {
    String value = String.valueOf(from + num);
    num = 3;
    return value;
};
二、访问成员变量和静态变量

与局部变量相比,在 Lambda 表达式中对成员变量和静态变量拥有读写权限:

    @FunctionalInterface
    interface Converter<F, T> {
        T convert(F from);
    }
class Lambda4 {
        // 静态变量
        static int outerStaticNum;
        // 成员变量
        int outerNum;

        void testScopes() {
            Converter<Integer, String> stringConverter1 = (from) -> {
                // 对成员变量赋值
                outerNum = 23;
                return String.valueOf(from);
            };

            Converter<Integer, String> stringConverter2 = (from) -> {
                // 对静态变量赋值
                outerStaticNum = 72;
                return String.valueOf(from);
            };
        }
    }
三、访问接口的默认方法

还记得第一章节中定义的那个 Formula (公式) 接口吗?

@FunctionalInterface
interface Formula {
    // 计算
    double calculate(int a);

    // 求平方根
    default double sqrt(int a) {
        return Math.sqrt(a);
    }
}

当时,我们在接口中定义了一个带有默认实现的 sqrt 求平方根方法,在匿名内部类中我们可以很方便的访问此方法:

Formula formula = new Formula() {
    @Override
    public double calculate(int a) {
        return sqrt(a * 100);
    }
};

但是在 lambda 表达式中可不行:

Formula formula = (a) -> sqrt(a * 100);

带有默认实现的接口方法,是不能在 lambda 表达式中访问的,上面这段代码将无法被编译通过。

相关文章

  • 四、Lambda 访问外部变量及接口默认方法

    一、访问局部变量 在 Lambda 表达式中,我们可以访问外部的 final 类型变量,如下面的示例代码: 与匿名...

  • 谈谈 final

    1 lambda访问外部变量必须是final的。 2. final修饰变量,类,方法 被final修饰的类不可以被...

  • GeekBand 第一周

    类 @interface定义一个接口文件,表示可以从外部访问RPoint。用于定义类、实例变量及类中的方法等定义信...

  • Swift 记点东西

    类方法访问不了外部变量如果想访问,在外部变量加static但是加了static, 对象方法访问不了... swif...

  • jdk 8

    接口默认实现 静态方法引用 lambda 日期 响应时编程

  • JAVA Vector学习笔记

    Vector Vector是实现了List接口和RandomAccess接口的集合类 构造方法及变量 数组默认大小...

  • JDK1.8新增特性参考

    Lambda表达式 Stream函数式操作流元素集合 接口新增:默认方法与静态方法 方法引用,与Lambda表达式...

  • Lamda 表达式作用域和内置函数式接口

    Lamda 表达式作用域 访问局部变量 可以直接在 lambda 表达式中直接访问外部的局部变量: 但是和匿名对象...

  • 《Java 8实战》学习总结

    Java 8新特性概览 Lambda表达式 流 默认方法 Lambda表达式 Lambda和函数式接口Java 8...

  • 接口与抽象类的区别

    接口: 接口中的变量和方法默认都是public的,且只能是public 接口中的变量默认是static final...

网友评论

      本文标题:四、Lambda 访问外部变量及接口默认方法

      本文链接:https://www.haomeiwen.com/subject/iyumoqtx.html