Java8的新特性

Java8的新特性

一、函数式接口

函数式接口 有且仅有一个抽象方法

1、Java内置的函数式接口

java 复制代码
// Function<T, R> -T作为输入,返回的R作为输出   
Function<String,String> fun = (x) -> {return "Function";};
System.out.println(fun.apply("hello world"));    // 输出: Function

//Predicate<T> -T作为输入,返回的boolean值作为输出
Predicate<String> pre = (x) ->{System.out.print(x);return false;};  
System.out.println(": "+pre.test("hello World"));  // hello World: false

//Consumer<T> - T作为输入,执行某种动作但没有返回值   
Consumer<String> con = (x) -> {System.out.println(x);};  
con.accept("hello world");  // hello world

//Supplier<T> - 没有任何输入,返回T   
Supplier<String> supp = () -> {return "Supplier";};  
System.out.println(supp.get());  // Supplier

//BinaryOperator<T> -两个T作为输入,返回一个T作为输出,对于"reduce"操作很有用   
BinaryOperator<String> bina = (x,y) ->{System.out.print(x+" "+y);return "BinaryOperator";};  
System.out.println(" "+bina.apply("hello ","world"));

二、Lambda表达式

Lambda表达式的本质: 作为函数式接口的实例对象【接口的匿名实现】,本质是一个匿名函数。

Lambda表达式对应的编译类型: 1、接口; 2、且该接口有且仅有一个抽象方法 即是(函数式接口)

1、Lambda作用

  • 简写接口的匿名内部类的写法

2、语法

java 复制代码
ArrayList<Integer> list = new ArrayList<>(); // 类型推到,运行类型的<>省略类型
list.add(1);
list.add(2);
list.add(3);
/**
 * (o1, o2) -> Integer.compare(o2, o1)
 * -> 表示Lambda操作符或者箭头操作符
 * -> 左边:Lambda形参列表(即:匿名内部类重新方法的形参列表)
 * -> 右边:Lambda体 (即:重写的抽象方法的方法体)
 */
list.sort((o1, o2) -> Integer.compare(o2, o1));
System.out.println(list);

3、Lambda表达式的六种使用

3.1、抽象方法:无参、无返回值
java 复制代码
Runnable r = () -> System.out.println("Runnable中的run方法被重写了");
r.run();
3.2、抽象方法:需要传一个参数、无返回值
java 复制代码
Consumer<String> con = (String s) -> System.out.println(s);
con.accept("Test");
3.3、抽象方法:需要传一个参数(类型省略,编译器自动推断)、无返回值
java 复制代码
Consumer<String> con = (s) -> System.out.println(s);
con.accept("Test");
3.4、抽象方法:只有一个参数时,形参的小括号可以省略、无返回值
java 复制代码
Consumer<String> con = s -> System.out.println(s);
con.accept("Test");
3.5、抽象方法:有两个或以上的参数,多条执行语句,并且有返回值
java 复制代码
Comparator<Integer> com = (o1, o2) -> {
   System.out.println("line one");
   return o1 - o2;
};
3.6、抽象方法:Lambda体只有一条语句时, return和大括号都可以省略
java 复制代码
Comparator<Integer> com = (o1, o2) -> o1 - o2;
com.compare(12, 6);

三、方法引用/构造器引用/数组引用

方法引用其实就是Lambda表达式的语法糖。

1、方法引用的使用前提:

重写的抽象方法的形参列表和返回值类型与Lambda体方法引用的方法的形参列表和返回值类型相同。

2、Lambda语法糖的写法

  • 对象 :: 非静态方法/实例方法名
  • 类 :: 静态方法名
  • 类 :: 非静态方法名

四、Stream API

1、并行流

2、串行流

五、接口的增强

1、静态方法

2、默认方法

六、Optional类

七、新的时间和日期API

八、其他特性

1、重复注解

2、类型注解

3、通用目标类型推断

4、JDK的更新

4.1、集合的流式操作
4.2、并发
4.3、Arrays
4.4、Number和Math
4.5、IO/NIO的改进
4.6、Reflection获取形参名
4.7、String: join()
4.8、Files

5、新编译工具:jjs、jdeps

6、JVM中的Metaspace取代PermGen空间

相关推荐
Patrick在香港2 小时前
Python Docker镜像从1.2GB到89MB:多阶段构建的完整优化实录
java·python·docker·信息可视化·容器·数据分析·ai编程
上海安当技术2 小时前
敏感数据怎么防拖库?信封加密(DEK+KEK 二层密钥)架构设计与 Java 实战
java·开发语言·python
我是唐青枫2 小时前
Java JCommander 实战详解:用注解解析命令行参数
java·开发语言
大鹏说大话2 小时前
C++ 内存布局详解:类、虚函数、虚表底层原理
java·开发语言
还是鼠鼠3 小时前
Spring AI连接DeepSeek与通义千问:application.yaml配置详解
java·通义千问·spring ai·deepseek
计算机小白一个3 小时前
蓝桥杯 Java B 组之哈希表应用(两数之和、重复元素判断)
java·数据结构·算法·蓝桥杯
sunburn-5 小时前
Java 队列全面详解:从入门到面试实战
java·开发语言·汇编·ide·idea
vx-程序开发5 小时前
springboot农产品运输服务平台---附源码75498
java·javascript·spring boot·python·eclipse·django·php
zzh___zzh6 小时前
SQL 窗口函数 ROW_NUMBER、RANK、DENSE_RANK 常用方法笔记
java
计科土狗6 小时前
GESP六级专题之类与对象
java·前端·数据库