目录
JAVA 8是JAVA编程语言开发的一个主要功能版本。它的最初版本于2014年3月18日发布。随着Java 8的发布,Java为函数式编程,新的JavaScript引擎,日期时间操纵的新API,新的流媒体API等提供了支持。
新功能
Lambda表达式 - 为Java增加了功能处理能力。
- 方法引用 - 通过名称引用函数,而不是直接调用它们。 使用函数作为参数。
- 默认方法 - 具有默认方法实现的接口。
- 新工具 - 添加新的编译器工具和实用程序,如'jdeps'以找出依赖关系。
- 流API - 新的流API以方便流水线处理。
- 日期时间API - 改进的日期时间API。
- 可选 - 强调最佳实践以正确处理空值。
- Nashorn,JavaScript引擎 - 一种执行JavaScript代码的基于Java的引擎
Lambda表达式
Lambda表达式在Java 8中引入,并被吹捧为Java 8的最大特性.Lambda表达式有助于函数式编程,并简化了开发过程。
其实是参考的Kotlin还是python来着 思想就是 ()->
句法
lambda表达式的特征在于以下语法。
parameter -> expression body
以下是lambda表达式的重要特征。
- Optional type declaration - 不需要声明参数的类型。 编译器可以从参数的值推断相同的值。
- Optional parenthesis around parameter - 不需要在括号中声明单个参数。 对于多个参数,需要括号。
- Optional curly braces - 如果身体含有单个陈述,则不需要在表情身体中使用花括号。
- Optional return keyword - 如果主体具有单个表达式以返回值,则编译器会自动返回值。 需要大括号来指示表达式返回一个值。
一般是形式是 ()-> expression 括号里是入参 箭头后面是具体的操作和返回值
下面是一个简单的例子
package com.java.eight;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* @author tangwei
* @date 2019/1/16 9:51
*/
public class Java8Tester {
public static void main(String[] args) {
List<String> names1 = new ArrayList<String>();
names1.add("Mahesh ");
names1.add("Suresh ");
names1.add("Ramesh ");
names1.add("Naresh ");
names1.add("Kalpesh ");
List<String> names2 = new ArrayList<String>();
names2.add("Mahesh ");
names2.add("Suresh ");
names2.add("Ramesh ");
names2.add("Naresh ");
names2.add("Kalpesh ");
Java8Tester tester = new Java8Tester();
System.out.println("Sort using Java 7 syntax: ");
tester.sortUsingJava7(names1);
System.out.println(names1);
System.out.println("Sort using Java 8 syntax: ");
tester.sortUsingJava8(names2);
System.out.println(names2);
}
public void sortUsingJava7(List<String> names) {
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
}
private void sortUsingJava8(List<String> names) {
names.sort(String::compareTo);
}
}
达到的效果是一样的
方法引用
方法引用有助于通过名称指向方法。使用“::”符号描述方法引用。方法引用可以用来指出以下类型的方法 -
静态方法
实例方法
使用new运算符的构造函数(TreeSet :: new)
本人写过C++ 这其实的借鉴参考的C++
public class Java8Tester {
public static void main(String args[]) {
List names = new ArrayList();
names.add("Mahesh");
names.add("Suresh");
names.add("Ramesh");
names.add("Naresh");
names.add("Kalpesh");
names.forEach(System.out::println);
}
}
names.forEach(System.out::println);
原先可能是
for (String name: names) {
System.out.println(name);
}
这种形式 有什么具体的实际好处 目前博主还没感觉出来
功能接口
功能接口具有可展示的单一功能。例如,使用单个方法'compareTo'的Comparable接口用于比较目的。Java 8已经定义了很多功能接口,以便在lambda表达式中广泛使用。具体接口列表在java.util.Function包中。
个人的理解就是为了更好的使用Lambda表达式而编写的接口的,使用的时候看下文档吧
这里不细究
默认方法
Java 8在接口中引入了默认方法实现的新概念。为了向后兼容,添加了此功能,以便可以使用旧接口来利用Java 8的lambda表达式功能。
例如,'List'或'Collection'接口没有'forEach'方法声明。因此,添加这样的方法只会破坏集合框架的实现。Java 8引入了默认方法,以便List / Collection接口可以具有forEach方法的默认实现,并且实现这些接口的类不需要实现相同的方法。
同上
Java 8流
Stream是Java 8中引入的一个新的抽象层。使用流,您可以使用类似于SQL语句的声明方式处理数据。
流比较抽象 后面会详讲 这样初探先过了
可选类
可选是用于包含非空对象的容器对象。可选对象用于表示缺少值的空值。这个类有各种实用方法来帮助代码将值处理为'可用'或'不可用',而不是检查空值。它在Java 8中引入,类似于Guava中的Optional。
Nashorn JavaScript
在Java8中,Nashorn引入了一个大大改进的JavaScript引擎,用于替换现有的Rhino。Nashorn提供的性能提高2到10倍,因为它直接编译内存中的代码并将字节码传递给JVM。Nashorn使用Java 7中引入的invoke动态特性来提高性能。
新的日期_时间API
在Java 8中,引入了一个新的日期时间API来涵盖旧的日期时间API的以下缺点。
- 不是线程安全的 - java.util.Date不是线程安全的,因此开发人员必须在使用日期时处理并发问题。 新的日期时间API是不可变的,并且没有setter方法。
- 糟糕的设计 - 默认日期从1900开始,月份从1开始,而日从0开始,因此没有统一性。 旧的API对日期操作的直接方法较少。新的API为这些操作提供了许多实用方法。
- 困难的时区处理 - 开发人员必须编写大量代码来处理时区问题。 新的API已经开发出来,保持了特定领域的设计。
Java 8在java.time包下引入了一个新的日期时间API。以下是java.time包中引入的一些重要类。 - 本地 - 简化的日期时间API,不需要处理时区复杂性。
- 分区 - 专门的日期时间API来处理各种时区。
Base64
在Java 8中,Base64终于得到了应有的效果。Java 8现在具有用于Base64编码的内置编码器和解码器。在Java 8中,我们可以使用三种类型的Base64编码。
- Simple - 输出映射到位于A-Za-z0-9 + /中的一组字符。 编码器不会在输出中添加换行符,并且解码器拒绝除A-Za-z0-9 + /以外的任何字符。
- URL - 输出被映射到位于A-Za-z0-9 +_中的一组字符。 输出是URL和文件名安全。
- MIME - 输出被映射为MIME友好格式。 输出以每行不超过76个字符的行表示,并使用回车'\ r'作为行分隔符,后接换行符'\ n'。编码输出的末尾不存在行分隔符。