JDK1.8新特性:JDK1.8究竟有那些新特性呢

本文详细介绍了JDK1.8的主要新特性,包括Lambda表达式简化代码、StreamAPI提升处理效率以及新日期时间API的增强。Lambda允许函数作为参数,方法引用使代码更紧凑,而StreamAPI提供了强大的数据处理能力。此外,还讨论了Optional类用于避免空指针异常,以及Nashorn JavaScript引擎的引入。这些新特性显著提高了Java的开发效率和代码质量。
摘要由CSDN通过智能技术生成

JDK1.8新特性:JDK1.8究竟有那些新特性呢

JDK1.8概述

JDK1.8,又称之为Java 8(我习惯叫它为JDK1.8,后续统一叫做JDK1.8),是Java语言开发的一个主要版本。Oracle公司于2014年3月18日发布,它支持函数式编程,新的JavaScript引擎,新的日期API,新的Stream API等。

JDK1.8相比1.7之前版本,有以下几方面的优化:

速度更快;

代码更少(Lambda表达式);

强大Stream API;

便于并行;

最大化减少空指针异常(OPtional类)。

举例如下,JDK1.8的特性是不是与众不同。
package com.xcbeyond.study.jdk8;

import org.junit.Test;
import java.util.Arrays;
import java.util.List;

/**
 * JDK1.8新特性
 * @Auther: xcbeyond
 * @Date: 2019/11/27 0027 23:53
 */
public class Java8Test {

    @Test
    public void java8Example() {
        // 定义一个整型list,对其进行遍历
        Integer[] numArray={1,2,3,4,5,6,7,8};
        List<Integer> numList= Arrays.asList(numArray);

        /**
         * 方式1:常规foreach
         */
        for (int num : numList) {
            System.out.println(num);
        }

        /**
         * 方式2:JDK1.8 新特性写法(Lambda表达式)
         *  代码量是不是少了很多
         */
        numList.forEach((num) -> System.out.println(num));
    }
}

新特性

JDK1.8新增了非常多的特性,本专题主要讨论以下几个:

Lambda表达式:Lambda允许把函数作为一个方法的参数(函数作为参数传递到方法中)。
方法引用:方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
默认方法:默认方法就是一个在接口里面有了一个实现的方法。
新工具:新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。
Stream API:新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。
Date Time API:加强对日期与时间的处理。
Optional类:Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
Nashorn,JavaScript引擎:JDK1.8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。

Lambda 表达式的结构

一个 Lambda 表达式可以有零个或多个参数
参数的类型既可以明确声明,也可以根据上下文来推断。例如:(int a)与(a)效果相同
所有参数需包含在圆括号内,参数之间用逗号相隔。例如:(a, b) 或 (int a, int b) 或 (String a, int b, float c)
空圆括号代表参数集为空。例如:() -> 42
当只有一个参数,且其类型可推导时,圆括号()可省略。例如:a -> return a*a
Lambda 表达式的主体可包含零条或多条语句
如果 Lambda 表达式的主体只有一条语句,花括号{}可省略。匿名函数的返回类型与该主体表达式一致
如果 Lambda 表达式的主体包含一条以上语句,则表达式必须包含在花括号{}中(形成代码块)。匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空

Lambda 表达式重要特征

可选类型声明 - 无需声明参数的类型。编译器可以从该参数的值推断。

可选圆括号参数 - 无需在括号中声明参数。对于多个参数,括号是必需的。

可选大括号 - 表达式主体没有必要使用大括号,如果主体中含有一个单独的语句。

可选return关键字 - 编译器会自动返回值,如果主体有一个表达式返回的值。花括号是必需的,以表明表达式返回一个值。

小试牛刀

new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("我是传统的写法");
            }
        }).start();
//------------------------------------------------------------
new Thread(() -> System.out.println("我是Lambda的写法")).start();

输出结果
在这里插入图片描述

Stream

Stream是一组用来处理数组,集合的API。

1.1 特性
不是数据结构,没有内部存储。
不支持索引访问。
延迟计算
支持并行
很容易生成数据或集合
支持过滤,查找,转换,汇总,聚合等操作。
1.2 运行机制
Stream分为源source,中间操作,终止操作。

流的源可以是一个数组,集合,生成器方法,I/O通道等等。

一个流可以有零个或多个中间操作,每一个中间操作都会返回一个新的流,供下一个操作使用,一个流只会有一个终止操作。

Stream只有遇到终止操作,它的源才会开始执行遍历操作。

1.1 Stream的创建

1.通过数组,Stream.of()
2.通过集合
3.通过Stream.generate方法来创建
4.通过Stram.iterate方法
5.其他API

import java.util.Arrays;
    import java.util.List;
    import java.util.stream.IntStream;
    import java.util.stream.Stream;
    
    public class CreateStream {
    
    	//通过数组,Stream.of()
        static void gen1(){
            String[] str = {"a","b","c"};
            Stream<String> str1 = Stream.of(str);
        }
    
    	//通过集合
        static void gen2(){
            List<String> strings = Arrays.asList("a", "b", "c");
            Stream<String> stream = strings.stream();
        }
    
    	//通过Stream.generate方法来创建
        static void gen3(){
        	//这是一个无限流,通过这种方法创建在操作的时候最好加上limit进行限制
            Stream<Integer> generate = Stream.generate(() -> 1);
            generate.limit(10).forEach(x -> System.out.println(x));
        }
        
    	//通过Stram.iterate方法
        static void gen4(){
            Stream<Integer> iterate = Stream.iterate(1, x -> x +1);
            iterate.forEach(x -> System.out.println(x));
        }
    
    	//其他API
        static void gen5(){
            String str = "abc";
            IntStream chars = str.chars();## 标题
            chars.forEach(x -> System.out.println(x));
        }
    }

日期和时间

  • Instant 本质上是一个数字时间戳。可以从a中检索当前的Instant Clock。这对于某个时间点的日志记录和持久性非常有用。
  • LocalDateTime 存储日期和时间。这会存储类似’2010-07-23T15:47:25.890’的日期时间。
  • .ZonedDateTime 使用时区存储日期和时间。如果您想要考虑到日期和时间的准确计算ZoneId,例如“欧洲/巴黎”,这将非常有用。在可能的情况下,建议使用没有时区的更简单的类。时区的广泛使用往往会给应用程序增加相当大的复杂性
  • LocalTime 没有日期存储时间。存储像’11:30’这样的时间,可用于存储开盘或收盘时间。
  • Instant 本质上是一个数字时间戳。可以从a中检索当前的Instant Clock。这对于某个时间点的日志记录和持久性非常有用。

其他类型

  • Month 用来存储一个月。这样可以隔离单个月份,例如“DECEMBER”。
  • DayOfWeek 用来存储一个星期的日子。这样可以隔离存储一个星期几,例如“星期二”
  • Year 用来存储一年。这样可以隔离一年,例如’2010’。
  • YearMonth 用来存储年加月份的时间。这会存储一年和一个月,例如“2010-12”,并可用于信用卡到期。
  • MonthDay 用来存储月份和日子。它存储月份和日期,例如“12-03”,可用于存储年度活动,如生日,而不存储年份。

Spring Data API


<!--java 8 time date 支持-->
<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-java8</artifactId>
	<version>5.0.12.Final</version>
</dependency>

MyBatis

<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis-typehandlers-jsr310</artifactId>
	<version>1.0.1</version>
</dependency>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值