1.jdk7新特性
- 二进制字面量
jdk7开始,可以用二进制字面量表示整数(byte、short、int、long)。使用二进制字面量可以让代码简介更易理解,使用时需要在二进制前加0b或者0B,示例如下:
int a = 0b
讯享网
- 字面量支持下划线
下划线不能出现在小数点旁、不能出现在数值开头和解围、不能出现在数值标示和进制之间,示例如下:
讯享网int a = 0b110_110
- swith语句支持字符串,示例如下:
switch(str) case a: break; case b: break;
- 泛型自动推断,示例如下:
讯享网List<String> list = new Arraylist<>();
- 异常多个catch合并,异常之间用|分割,示例如下:
try(){
} catch(IOExcepton | NullPointerException e) {
}
- try-with-resource语句支持
之前使用流时需要在finally里手动关闭释放资源,现在只要接口实现java.lang.AutoCloseable,系统会自动关闭资源,示例如下:
讯享网private static void method() {
FileReader fr = null; FileWriter fw = null; try {
fr = new FileReader("a.txt"); fw = new FileWriter("b.txt"); int ch = 0; while ((ch = fr.read()) != -1) {
fw.write(ch); } } catch (IOException e) {
e.printStackTrace(); } finally {
if (fw != null) {
fw.close(); } if (fw != null) {
fr.close(); } } // 改进版的代码 try (FileReader fr = new FileReader("a.txt"); FileWriter fw = new FileWriter("b.txt");) {
int ch = 0; while ((ch = fr.read()) != -1) {
fw.write(ch); } } catch (IOException e) {
e.printStackTrace(); } }
2.jdk8新特性
- lambada表达式
lambada表达式也可成为闭包,允许将函数作为参数传递。lambada表达式组成:逗号分割的参数列表,-> ,函数体三部分表示,函数体比较复杂时可以将函数体放在{},示例如下:
new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();
- 日期API
java.util.Date是非线程安全的,时区处理比较麻烦,jdk8在java.time包下提供了很多新的API,以下是两个重要的API:
Local:简化了日期处理,没有时区问题
Zoned:通过制定的时区处理日期时间
示例如下:
讯享网LocalDate.now(); // 获取当前时间 ZonedDateTime.now(Clock.systemUTC()); // 获取UTC时区的时间
- 引入Optional,常用方法如下:
(1)Optional.of(T t): 创建一个Optional 实例 (2)Optional.empty(): 创建一个空的Optional 实例 (3)Optional.ofNullable(T t):若t不为null,创建 Optional 实例,否则创建空实例 (4)isPresent():判断是否包含值 orElse(T t): 如果调用对象包含值,返回该值,否则返回t (5)orElseGet(Supplier s):如果调用对象包含值,返回该值,否则返回s获取的值 (6)map(Function f):如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty() (7)flatMap(Function mapper):与 map 类似,要求返回值必须是Optional
- Stream流,可对集合进行复杂的查找、过滤、去重、排序等,示例如下:
讯享网 Map<Integer, Integer> map = new HashMap<>(); map.put(10, 10); map.put(31, 31); map.put(53, 53); map.put(86, 86); map.put(20, 20); // 转list List<Integer> list = map.keySet().stream().collect(Collectors.toList()); // 过滤获取偶数 list = list.stream().filter(item -> item % 2 == 0).collect(Collectors.toList()); // 从大到小排序 list = list.stream().sorted((a, b) -> b - a).collect(Collectors.toList()); list.stream().forEach(item -> {
System.out.println(item);});
- 接口可以定义默认方法、静态方法
默认方法:传统方式接口中定义的方法都是抽象方法,实现接口的类都需要实现抽象方法,接口中如果需要新增方法,所有类都要实现,不符合OCP原则。jdk8引入了默认方法,使用default关键字定义,可以有具体方法实现,实现类不必做修改。如果多个接口都有默认方法,可以用super指定默认方法,也可以自己实现覆盖。示例如下:
public interface Test{
default void hello(){
System.out.println("我是接口默认方法,哈哈!"); } }
讯享网 静态方法:接口中可以实现静态方法,示例如下:
public interface Test {
public static void sysHello() {
System.out.println("你好啊,我是接口静态方法!"); } }
- 函数式接口
如果一个接口只有一个抽象方法,该接口可以称之为函数式接口,函数式接口可以使用lambada表达式,lambada会被匹配到这个抽象方法上,@FunctionalInterface注解检测接口是否符合函数式接口,常见的函数式接口Predicate,Function<T,R>,示例如下:
讯享网public class Test03 {
public static void main(String[] args) {
Operater o=arr -> {
int sum=0; for(int n:arr){
sum+=n; } System.out.println("数组的和为:"+sum); }; fun(o); } public static void fun(Operater operater){
int[] arr={
2,3,4,5,6,7,11}; operater.getSum(arr); } } @FunctionalInterface interface Operater{
//求数组的和 public abstract void getSum(int[] arr); }
- 方法引用
方法引用是lambada的一种简写形式。如果lambada表达式方法体中只是调用一个特定的已存在的方法,则可以使用方法引用。常见形式:
对象::实例方法 类::静态方法 类::实例方法 类::new

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/117443.html