zoukankan      html  css  js  c++  java
  • 1、lambda表达式

    lambda表达式中的类型是通过上下文推断出来的,类似String[] strArr = {"as","sd"};右边元素的子类型。

    匿名内部类的情况:需要引用它所在方法里的变量。这时候,需要将变量声明为final。声明为final,意味着不能为其重复赋值,同时也意味着在使用final变量时,实际上时在使用赋给该变量的一个特定的值。
    java 8虽然放松了这一限制,可以引用非final变量,但是该变量在既成事实上必须是final,虽然无需将变量声明为final,但是在Lambda表达式中,也无法用作非终态变量,如果坚持用作非终态变量,编译器就会报错。

    函数接口
    函数接口是只有一个抽象方法的接口,用作Lambda表达式的类型
    接口里面只有一个抽象方法。
    接口中单一方法的命名并不重要,只要方法签名和Lambda表达式的类型匹配即可。可以在看书接口中为参数起一个有意义的名字,增加代码易读性,编译更透彻的理解参数的用途。
    函数接口可以接收1个或多个参数,返回或不返回值,还可以使用泛型,这完全取决于你要干什么。
    java中频繁出现的函数接口,在Java开发工具包(JDK)中提供的一组核心接口会频繁出现,大概如下,列出来你可能会便于理解下:
    接口 参数 返回类型 示例
    Predicate<T> T boolean 这张唱片已经发行了吗
    Consume<T> T void 输出一个值
    Function<T,R> T R 获取Artist对象的名字
    Supplier<T> None T 工厂方法
    UnaryOperator<T> T T 逻辑非(!)
    BinaryOperator<T> (T,T) T 求两个数的乘机(*)

    类型推断
    某些情况下,用户需要手动指明类型,建议大家根据自己或者项目组的习惯,采用让代码最便于阅读的方法。有时候省略类型信息可以减少干扰,更易于弄清情况;而有时候却需要类型信息帮助理解代码。
    Lambda表达式中的类型推断,实际上时java 7就引入的目标类型推断的拓展。读者可能已经知道java7中的菱形操作符,它可以使得javac推断出泛型参数的类型。
    例子:使用菱形操作符省略手动声明类型
    public void testGenericity(){
    Map<String, Integer> oldWorldCOunts = new HashMap<String, Integer>();
    Map<String, Integer> diamondWorldCounts = new HashMap<>();
    useHashMap(new HashMap<>());
    }
    public void useHashMap(Map<String, String> values){

    }
    java 7中程序员可省略构造函数的泛型类型,java 8 更进一步,程序员可省略Lambda表达式中的所有参数类型。这不是魔法,javac根据Lambda表达式上下文信息就能推断出参数的正确类型。程序依然要经过类型检查来保证运行的安全性,但不再用显式声明类型罢了。这就是所谓的类型推断。
    上面代码中的useHashMap(new HashMap<>())在java7中时无法通过编译的,java8中对类型推断系统进行了改善。

    public void typeDeduce(){
    Predicate<Integer> atLeast5 = x -> x > 5 ;
    }
    Predicate也是一个Lambda表达式,和前文中ActionListener不同的是,它返回一个值。在上面例子中,表达会x > 5是Lambda表达式的主体。这样的情况下,返回值就是Lambda表达式主体的值。
    //Predicate接口的源码,接受一个对象,返回一个布尔值
    public interface Predicate<T> {
    boolean test(T t);
    }
    //略复杂的类型推断
    BinaryOperator<Long> addLongs = (x, y) -> x + y;
    类型推断系统相当智能,但若信息不够,类型推断系统也无能为力。系统不会漫无目的的瞎猜,而会终止操作并报告编译错误,寻求帮助。
    BinaryOperator addLongs = (x, y) -> x + y;会报错 Operator '% #x002B;' cannot be applied to java.lang.Object, java.lang.Object.

  • 相关阅读:
    jmeter分布式配置
    APP自动化测试获取包名的两种方法
    Monkey自动化测试命令
    jmeter之http请求用csv读取中文乱码
    jmeter断言之响应code:200
    使用 form 和 iframe 实现图片上传回显
    sublime3 破解
    在cmd下面执行.py文件时提示ModuleNotFoundError 但是 IDE 不报错
    windows 开启 nginx 监听80 端口 以及 禁用 http 服务后,无法重启 HTTP 服务,提示 系统错误 123,文件目录、卷标出错
    python打包exe
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/7169159.html
Copyright © 2011-2022 走看看