虽然Java已经发行了Java14,但在Java开发中用得最多的也就Java8了,而且现在准确来讲Java8中的一些特性也算不上新特性,但是掌握好运用其特性,能过让我们写出更优雅的代码👨💻
用Java8如何写出优雅的代码?
那得从熟悉Java8特性开始,Java8引入的一个核心概念是
函数式接口
。通过在接口里面添加一个抽象方法,这些方法可以直接从接口中运行。如果一个接口定义个唯一一个抽象方法,那么这个接口就成为函数式接口。同时引入一个新的注解:@FunctionalInterface
,表示这个接口是函数式接口,而且添加了这个接口后只允许有一个抽象方法,否则编译器会报错。
Lambada表达式
函数式接口的重要属性是,我们能够使用Lambda实例化它们。Lambda表达式可以将函数作为方法参数,或者将代码作为数据对待。
- 优点: 可读性强,而且使并行操作大集合变得方便
它是由三部分组成的:第一部分为一个扩号内用逗号分隔的形式参数;第二部分就是箭头符号->
;第三部部分就是表达式或者代码块
🌰:(int a,int b) -> {return System.Out.Println(a+b);}
也可使用简写:
- 省略参数类型:条件是Lambda表达式可以根据上下文环境推断出参数类型。
🌰:(a,b)->{return a+b;}
- 省略参数小括号:条件是Lambda表达式中只有一个参数。
🌰:(int a) ->{ return a+a;}
- 省略return和大括号:条件是Lambda表达式体中只有一条语句。
🌰:a -> a*a;
除此之外,由于要使用Lambda表达式,需要定义一个函数式接口,往往会充斥着过量的函数式接口,所以Java8的java.util.function中增加了不少的函数式通用接口
Function<T,R>
:将T作为数,返回R作为输出,还包含了和其他函数组合的默认方法。Predicate<T>:
将T作为输入,返回一个布尔值作为输出,该接口包含多种默认方法来将Predicate组合成其他复杂的逻辑(与、或、非)。Consumer<T>
:将T作为输入,不返回任何内容,表示在单个参数上的操作。
集合之流式操作
Java8引入了流式操作(
Stream
),通过该操作可以实现对集合的并行处理和函数式操作。根据操作返回的结果不同,流式操作分为中间操作和最终操作。最终操作返回的是特定类型的结果,而中间操作返回流本身,这样可以把多个操作依次串联起来,流式操作实现了集合的过滤、排序、映射等功能。
- Stream和Collection的区别在于:前者主要是有关计算的,面向CPU,而后着主要是静态内存数据结构,主要面向内存。
- Stream有串行的流和并行的流,它们之间可以相互切换;通过stream.sequential()返回串行的流,通过stream.parallel()返回并行的流。
- 中间操作:返回流本身
fileter()
:对元素进行过滤;sorted()
:对元素排序;map()
:元素的映射;distinct()
:去除重复元素;subStream()
:获取子Stream等;
- 终止操作:返回特定的结果
forEach()
:对每个元素做处理;toArray()
:把元素到处到数组;findFirst()
: 返回第一个匹配的元素;anyMatch()
:是否有匹配的元素等。
Java8新增的日期API
新的java.time中包含了所有关于时钟(Clock),本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)的类
- 应用🌰:
//LocalDate
LocalDate localDate = LocalDate.now(); //获取本地日期
localDate = LocalDate.ofYearDay(2014, 200); // 获得 2014 年的第 200 天
System.out.println(localDate.toString());//输出:2014-07-19
localDate = LocalDate.of(2014, Month.SEPTEMBER, 10); //2014 年 9 月 10 日
System.out.println(localDate.toString());//输出:2014-09-10
//LocalTime
LocalTime localTime = LocalTime.now(); //获取当前时间
System.out.println(localTime.toString());//输出当前时间
localTime = LocalTime.of(10, 20, 50);//获得 10:20:50 的时间点
System.out.println(localTime.toString());//输出: 10:20:50
//Clock 时钟
Clock clock = Clock.systemDefaultZone();//获取系统默认时区 (当前瞬时时间 )
long millis = clock.millis();//
参考链接:Java8新特性概述