Java8新特性(学习笔记)

1.Lambda表达式(常用)
2.函数式接口
3.方法引用和构造器引用
4.Stream API(常用)
5.接口中的默认方法和静态方法
6.新时间日期API
7.其他新特新(Optional)

1.Lambda

Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁,更灵活的代码。
一,Lambda 表达式的基础语法:Java8中引入了一?个新的操作符 "->" 该操作符为箭头操作符或 Lambda操作符,箭头操作符将Lambda表达式拆分成两部分:
左侧:Lambda 表达式的参数列表
右侧:Lambda 表达式中所执行的功能,即 Lambda体。
语法格式一:无参数,无返回值

() -> System.out.println("Hello Lambda!" );

语法格式二:有一个参数,无返回值

(x) -> System.out.println(x)

语法格式三:有一个参数,可以不加()

x -> System.out.println(x)

语法格式四:有两个以上的参数,有返回值,并且Lambda体中有多条语句

(x, y) -> {
           System.out.println("函数式接口");
           return Integer.compare(x, y);
       };

语法格式五:相对于四 若Lambda体中只有一条语句,return 和 {} 都可以省略不写

(x, y) -> Integer.compare(x, y);

语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写, 因为JVM编译器通过上下问推断出数据类型, 即 "类型推断"

(Integer x, Integer y) -> Integer.compare(x, y);

二,Lambda 表达式需要“函数式接口”的支持
函数式接口:接口中只有一个抽象方法的接口,称为函数式接口。可以使用@FunctionalInterface 修饰,来检查是否是函数式接口

2.Java8 内置的四大核心函数式接口

Consumer : 消费型接口
     void accept(T t);
Supplier : 供给型接口
     T get();
Function : 函数型接口
     R apply(T t);
Predicater : 断言型接口
     boolean test(T t);

3.方法引用和构造器引用

一.方法引用:若lambda体中的内容已经有方法实现了,我们可以使用“方法引用”
主要有三种语法格式:
①对象::实列方法名
②类::静态方法名
③类::实列方法名
注意:
①Lambda体中调用方法的参数列表与返回值类型,要与函数式接口中抽象方法的>函数列表和返回值类型保持一致
②若Lambda 参数列表中的第一个参数是实列方法的调用者,而第二个参数是实列方>法的参数时,可以使用 类::实列方法名

对象::实列方法名
Consumer consumer1 = System.out::println;
   
类::静态方法名
Comparator comparator1 = Integer::compare;        
 
类::实列方法名
BiPredicate predicate = String::equals;    

二.构造器引用
格式:
类::new
注意:需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表保持一致

Supplier supplier = String::new;

三.数组引用

Function function = String[]::new;

四.Stream(流)

Stream是数据渠道,用于操作数据源(集合,数组等)所生成的元素序列。
"集合讲的是数据,流讲的是计算"
注意:
①Stream自己不会存储元素
②Stream不会改变源对象,相反,它会返回持有结果的新Stream
③Stream操作是延迟执行的,它会等到需要结果时才执行

一.Stream操作的三个步骤:创建Stream->中间操作->终止操作

      // 1.可以通过Collection系列集合提供的stream() 或 paralleStream() 获取集合流
      List strings = new ArrayList<>();
       Stream stream = strings.stream();// 串行
       Stream stream1 = strings.parallelStream();// 并行

       // 2.通过Arrays中静态方法stream()获取数组流
       String[] array = new String[10];
       Stream stream2 = Arrays.stream(array);

       // 3. 通过Stream类中静态方法of() 获取流
      Stream stringStream = Stream.of("1", "2", "3");

       // 4.创建无限流
       // 4.1 迭代
       Stream iterate = Stream.iterate(0, x -> x + 3);
       iterate.forEach(System.out::println);
       iterate.limit(10).forEach(System.out::println);// limit中间操作
       // 4.2 生成
       Stream generate = Stream.generate(() -> Math.random());
       generate.forEach(System.out::println);

你可能感兴趣的:(Java8新特性(学习笔记))