美文网首页
Java8核心点

Java8核心点

作者: 沐兮_d64c | 来源:发表于2019-05-28 19:58 被阅读0次

    1,简介

    1)synchronized多核cpu上,需要sync cpu高速缓存,需要进行内核间缓存一致性通信,代价很大。
    2)新增Streams流处理函数式编程
    【流处理】:java.util.stream中新增Stream<T>的api。类似于linux命令处理流,并使用管道 | 连接起来。cat file1.txt file2.txt | grep "my word" | head -10,Streams可以更好的利用多核cpu,并行处理。
    【函数式编程】:行为参数化,把代码传递给方法,允许将方法作为值。原先只能通过匿名类给方法传递函数功能。
    方法引用语法 :: 例如 File::isHidden 会创建一个方法引用,进而作为值进行传递。
    【接口默认方法】:接口可以包含实现类没有提供的方法,使用default关键字标名
    【其它】:Lambda 匿名函数 与Optional<T>避免null值。

    image.png
    3)外部迭代和内部迭代
    使用for-each一个个迭代并处理元素,称为外部迭代迭代器模式,原集合remove时,会ConcurrentModificationException,使用iterator.remove可以避免。
    使用Stream API在库内部进行迭代,称为内部迭代。

    2,Lambda表达式

    1)lambda匿名函数,有参数列表、函数主体、返回类型,还有可能抛出的异常列表
    可以在函数式接口上使用lambda表达式
    2)语法表达式可以隐式返回;语句必须主动return
    (parameters) -> expression 或者 (parameters) -> { statements; } 注意花括号和语句结尾符;
    (String s) -> s.length()
    (Apple a) -> a.getWeight() > 10
    (int x, int y) -> {
    System.out.println("x:" + x);
    System.out.println("y:" + y);
    }
    () -> "result"
    (Apple a, Apple b) -> a.getWeight().compareTo(b.getWeight())
    当只有一个参数,且其类型可推导时,圆括号()可省略。如: a -> return a*a
    3)lambda和匿名内部类方法作为值

    image.png
    4)lambda表达式:可以赋值给一个变量作为参数传递一个一个接受函数式接口的方法(lambda表达式的签名,需要与函数式接口的默认方法的签名一致)。
    函数描述符(签名):() -> void 表示参数为空,返回值为void的函数签名
    (Apple a, Apple b) -> int 表示接受两个Apple作为参数,返回int的函数签名
    5)在支持一类函数的语言中,Lambda 表达式的类型是函数;在 Java 中,Lambda 表达式是对象,他们必须依附于一类特别的对象类型——函数式接口(functional interface)
    6)lambda与匿名内部类的区别
    1.对于this关键字,匿名内部类解析为内部类;lambda表达之解析为lambda的外部类。
    2.java编译器将lambda表达式转换类类的私有函数;匿名内部类编译为.class文件。

    3,函数式接口

    1)定义: 只定义了一个抽象方法的接口,使用了@FunctionalInterface注解()。如java.lang.Runnable、java.util.concurrent.Callable
    函数描述符:函数式接口的抽象方法的签名(方法名+形参列表)。
    2)java.util.function.Predicate
    functional interface函数式接口,函数方法:参数泛型,返回boolean值( 输入的对象是否 符合某个条件)
    函数描述符:boolean test(T t) 接受泛型参数,返回boolean值。

    image.png
    image.png
    3)java.util.function.Consumer
    funtional interface函数式接口,函数方法:参数泛型,返回值void(需要访问T,并对其执行某些操作时使用。)
    image.png
    image.png
    4)java.utils.function.Function
    接受一个参数,产出一个结果,两者类型可能不同
    image.png
    image.png

    4,方法引用

    1)重复使用现有方法的定义,可以看做lambda表达式的语法糖,使用::

    2)方法引用的类型不需要(),因为并没有实际调用
    指向类的静态方法的引用Integer::parseInt
    指向类的实例方法的引用String::length
    指向对象的实例方法的引用myService.query(userId)
    3)引用类型和lambda的对应

    image.png

    相关文章

      网友评论

          本文标题:Java8核心点

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