欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

Java8进修 劳务派遣管理系统 条记

点击: 次  来源:宝鼎软件 时间:2017-06-01

原文出处: Listen

Java8是2014年宣布的,至今也已经有快三年的时间了,之前固然有进修过,可是学的较量零星,不成系统,并且也没有包围到Java8所有的特性。 由于公司已经利用了JDK1.8,所以事情中能利用Java8的时机照旧许多的,因此抉择来系统地进修一下Java8的新特性,这是对我最近进修Java8的一些记录, 以备在有些细节记不太清的时候可以查询。

Java8

先来一个概览,上图是我整理的Java8中的新特性,总的来看,大抵上可以分成这么几个大块。

函数式接口

所谓的函数式接口就是只有一个抽象要领的接口,留意这里说的是抽象要领,因为Java8中插手了默认要领的特性,可是函数式接口是不体贴接口中有没有默认要领的。 一般函数式接口可以利用@FunctionalInterface注解的形式来标注暗示这是一个函数式接口,该注解标注与否对函数式接口没有实际的影响, 不外一般照旧推荐利用该注解,就像利用@Override注解一样。JDK1.8中提供了一些函数式接口如下:

函数式接口 函数描写符 原始范例特化
Predicate<T> T -> boolean IntPredicate, LongPredicate, DoublePredicate
Consumer<T> T -> void IntConsumer, LongConsumer, DoubleConsumer
Function<T,R> T -> R IntFunction<R>, IntToDoubleFunction, IntToLongFunction, LongFunction<R>, LongToDoubleFunction, LongToIntFunction, DoubleFunction<R>, ToIntFunction<T>, ToDoubleFunction<T>, ToLongFunction<T>
Supplier<T> () -> T BooleanSupplier, IntSupplier, LongSupplier, DoubleSupplier
UnaryOperator<T> T -> T IntUnaryOperator, LongUnaryOperator, DoubleUnaryOperator
BinaryOperator<T> (T,T) -> T IntBinaryOperator, LongBinaryOperator, DoubleBinaryOperator
BiPredicate<L,R> (L,R) -> boolean
BiConsumer<T,U> (T,U) -> void ObjIntConsumer<T>, ObjLongConsumer<T>, ObjDoubleConsumer<T>
BiFunction<T,U,R> (T,U) -> R ToIntBiFunction<T,U>, ToLongBiFunction<T,U>, ToDoubleBiFunction<T,U>

上表中的原始范例特化指的是为了消除自动装箱和拆箱的机能开销,JDK1.8提供的针对根基范例的函数式接口。

Lambda表达式和要领引用

有了函数式接口之后,就可以利用Lambda表达式和要领引用了。其实函数式接口的表中的函数描写符就是Lambda表达式,在函数式接口中Lambda表达式相当于匿名内部类的结果。 举个简朴的例子:

public class TestLambda {

    public static void execute(Runnable runnable) {
        runnable.run();
    }

    public static void main(String[] args) {
        //Java8之前
        execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("run");
            }
        });

        //利用Lambda表达式
        execute(() -> System.out.println("run"));
    }
}

可以看到,对比于利用匿名内部类的方法,Lambda表达式可以利用更少的代码可是有更清晰的表述。留意,Lambda表达式也不是完全等价于匿名内部类的, 两者的差异点在于this的指向和当地变量的屏蔽上。

Lambda表达式还可以复合,把几个Lambda表达式串起来利用:

Predicate<Apple> redAndHeavyApple = redApple.and(a -> a.getWeight() > 150).or(a -> “green”.equals(a.getColor()));

上面这行代码把两个Lambda表达式串了起来,寄义是选择重量大于150可能绿色的苹果。

要领引用可以看作Lambda表达式的更简捷的一种表达形式,利用::操纵符,软件开发,要领引用主要有三类:

  1. 指向静态要领的要领引用(譬喻Integer的parseInt要领,写作Integer::parseInt);
  2. 指向任意范例实例要领的要领引用(譬喻String的length要领,写作String::length);
  3. 指向现有工具的实例要领的要领引用(譬喻假设你有一个当地变量localVariable用于存放Variable范例的工具,它支持实例要领getValue,那么可以写成localVariable::getValue)。