学习笔记12 - java 8新特性
函数式Functional接口
@FunctionalInterface 接口中只声明了一个抽象方法 在java.util.function中有java8丰富的函数式接口
Lambda表达式
作为函数式接口的实例 () -> {}; 1.举例:(o1,o2) ->{ Integer.compare(o1,o2);}; 2.格式:lambda形参列表、 lambda操作符(箭头操作符)、lambda体(重写的抽象方法) 左边:形参类型可以省略, 一个参数时()可以省略 右边:方法体用{}; 如果只有一条执行语句(或return),可以省略{}和return 3.使用: ①无参、无返回值 Runnable r1 = () -> {System.out.println(“123”)}; r1.run(); ②一个参数,无返回值 Consumer con = (String s) ->{ System.out.println(s);}; con.accept(“123”); ③类型推断 Consumer con = (s) ->{System.out.println(s);}; ④只有一个参数,可以省略小括号 Consumer con = s ->{System.out.println(s);}; ⑤有2个或以上参数,多条执行语句,有返回值 Comparator com = (o1,o2) -> { System.out.println(o1); System.out.println(o2); return o1.compareTo(o2); }; ⑥只有一条执行语句,且有返回值,可以省略大括号和return
方法引用
当传递给lambda体的操作,已经有实现的方法,可以使用方法引用,本质也是函数式接口的实例 1.格式 类(或对象) ::方法名 【类或对象是已有方法的所属的类或对象】 2.使用 ① 对象::非静态方法 ②类::静态方法 ③类::非静态方法 3.①②要求: 函数式接口中的 形参列表和返回值类型 与 方法引用中的方法中的… 一致
4.举例: //Function中的R apply(T t) Math中的Long round(Double d) Function<Double,Long> func1 = (d) -> Math.round(d); System.out.println(func1.apply(20.1));
Function<Double,Long> func2 = Math::round; System.out.println(func2.apply(22.3));
构造器引用
类似于方法引用 函数式接口的形参列表 和 构造器的形参列表一致 接口中抽象方法的返回值类型即为构造器所属的类
Stream API
java.util.stream 用于操作运算数据源 stream不会存储元素;不会改变源对象,会返回一个持有结果的新stream;延迟执行,需要结果时才执行
Stream的实例化
①通过集合 //default Stream stream() 返回一个顺序流 Stream stream = Collection.stream(); //default Stream parallelStream() 返回一个顺序流 Stream parallelStream = Collection.paralledStream(); ②通过数组 //调用Arrays类:static Stream stream(T[] array) 返回一个流 Stream stream = Arrays.stream(arr); ③通过Stream的of() Stream stream = Stream.of(1,2,3); ④创建无限流 迭代 public static Stream iterate(final T seed , final UnaryOperator f ) 生成 public static Stream generate (Supplier s)
中间操作(链)
终止操作
Optional类
常用 ofNullable(T t) orElse(T t)