最后
各位读者,由于本篇幅度过长,为了避免影响阅读体验,下面我就大概概括了整理了
使用方式:Class::method
test.test(Test::testM);
其实上面三种方法引用都好理解,最后类的实例方法引用,有两个条件:
- 首先要满足实例方法,而不是静态方法
- Lambda 表达式的第一个参数会成为调用实例方法的对象 根据这两点我们看上面的例子,test 方法接受一个 TestInt 实例,用 Lambda 表达式表示就是 (Test t1, Test t2) -> res,而我们调用 test 方法时传入的方法引用是 Test::testM,其参数也是一个 Test 实例,最终 test.test(Test::testM) 的调用效果就是 t1.testM(t2)
3. 接口默认方法和静态方法
Java 8 新增了接口的默认实现,通过 default 关键字表示。同时也可以提供静态默认方法。
public interface TestInterface {
String test();
// 接口默认方法
default String defaultTest() {
return “default”;
}
static String staticTest() {
return “static”;
}
}
4. 重复注解
Java 8 支持了重复注解。在 Java 8 之前想实现重复注解,需要用一些方法来绕过限制。比如下面的代码。
@interface Author {
String name();
}
@interface Authors {
Author[] value();
}
@Authors({@Author(name=“a”), @Author(name = “b”)})
class Article {
}
而在 Java 8 中,可以直接用下面的方式。
@Repeatable(Authors.class)
@interface Author {
String name();
}
@interface Authors {
Author[] value();
}
@Author(name = “a”)
@Author(name = “b”)
class Article {
}
在解析注解的时候,Java 8 也提供了新的 API。
AnnotatedElement.getAnnotationsByType(Class)
5. 类型注解
Java 8 之前注解只能用在声明中,在 Java 8 中,注解可以使用在 任何地方。
@Author(name=“a”)
private Object name = “”;
private String author = (@Author(name=“a”)String) name;
6. 更好的类型推断
Java 8 对于类型推断做了改进。
比如在 Java 7 中下面的写法:
List stringList = new ArrayList<>();
stringList.add(“A”);
stringList.addAll(Arrays.asList());
在 Java 8 中改进后的写法,可以自动做类型推断。
List stringList = new ArrayList<>();
stringList.add(“A”);
stringList.addAll(Arrays.asList());
7. Optional
Java 8 中新增了 Optional 类用来解决空指针异常。Optional 是一个可以保存 null 的容器对象。通过 isPresent() 方法检测值是否存在,通过 get() 方法返回对象。
除此之外,Optional 还提供了很多其他有用的方法,具体可以查看文档。下面是一些示例代码。
// 创建一个 String 类型的容器
Optional str = Optional.of(“str”);
// 值是否存在
boolean pre = str.isPresent();
// 值如果存在就调用 println 方法,这里传入的是 println 的方法引用
str.ifPresent(System.out::println);
// 获取值
String res = str.get();
// 传入空值
str = Optional.ofNullable(null);
// 如果值存在,返回值,否则返回传入的参数
res = str.orElse(“aa”);
str = Optional.of(“str”);
// 如果有值,对其调用映射函数得到返回值,对返回值进行 Optional 包装并返回
res = str.map(s -> “aa” + s).get();
// 返回一个带有映射函数的 Optional 对象
res = str.flatMap(s -> Optional.of(s + “bb”)).flatMap(s -> Optional.of(s + “cc”)).get();
8. Stream
Java 8 中新增的 Stream 类提供了一种新的数据处理方式。这种方式将元素集合看做一种流,在管道中传输,经过一系列处理节点,最终输出结果。
关于 Stream 提供的具体方法,可以参照 API。下面是一些示例代码。
List list = Arrays.asList(“maa”, “a”, “ab”, “c”);
list.stream()
.filter(s -> s.contains(“a”))
.map(s -> s + “aa”)
.sorted()
.forEach(System.out::println);
System.out.println(“####”);
list.parallelStream().forEach(System.out::println);
List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
int res = numbers.stream().map(i -> i + 1).mapToInt(i -> i).summaryStatistics().getMax();
System.out.println(res);
9. 日期时间 API
Java 8 中新增了日期时间 API 用来加强对日期时间的处理,其中包括了 LocalDate,LocalTime,LocalDateTime,ZonedDateTime 等等,关于 API 可以参照官方文档以及这篇博客,写的很详细。下面是示例代码。
LocalDate now = LocalDate.now();
System.out.println(now);
System.out.println(now.getYear());
System.out.println(now.getMonth());
System.out.println(now.getDayOfMonth());
LocalTime localTime = LocalTime.now();
System.out.println(localTime);
LocalDateTime localDateTime = now.atTime(localTime);
System.out.println(localDateTime);
10. Base64 支持
Java 8 标准库中提供了对 Base 64 编码的支持。具体 API 见可参照文档。下面是示例代码。
String base64 = Base64.getEncoder().encodeToString(“aaa”.getBytes());
System.out.println(base64);
byte[] bytes = Base64.getDecoder().decode(base64);
System.out.println(new String(bytes));
11. 并行数组 ParallelSort
Java 8 中提供了对数组的并行操作,包括 parallelSort 等等,具体可参照 API。
Arrays.parallelSort(new int[] {1, 2, 3, 4, 5});
12. 其他新特性
- 对并发的增强 在java.util.concurrent.atomic包中还增加了下面这些类: DoubleAccumulator DoubleAdder LongAccumulator LongAdder
- 提供了新的 Nashorn javascript 引擎
- 提供了 jjs,是一个给予 Nashorn 的命令行工具,可以用来执行 JavaScript 源码
- 提供了新的类依赖分析工具 jdeps
- JVM 的新特性 JVM内存永久区已经被metaspace替换(JEP 122)。JVM参数 -XX:PermSize 和 –XX:MaxPermSize被XX:MetaSpaceSize 和 -XX:MaxMetaspaceSize代替。
可以看到,Java 8 整体上的改进是很大的,最重要的是引入 Lambda 表达式,简化代码。
其他一些改进可参照 www.oracle.com/technetwork…
Java 9
1. Jigsaw 模块系统
在 Java 9 以前,打包和依赖都是基于 JAR 包进行的。JRE 中包含了 rt.jar,将近 63M,也就是说要运行一个简单的 Hello World,也需要依赖这么大的 jar 包。在 Java 9 中提出的模块化系统,对这点进行了改善。 关于模块化系统具体可以看看这篇文章。
2. JShell REPL
Java 9 提供了交互式解释器。有了 JShell 以后,Java 终于可以像 Python,Node.js 一样在 Shell 中运行一些代码并直接得出结果了。
3. 接口中使用私有方法
Java 9 中可以在接口中定义私有方法。示例代码如下:
public interface TestInterface {
String test();
// 接口默认方法
default String defaultTest() {
pmethod();
return “default”;
}
private String pmethod() {
System.out.println(“private method in interface”);
return “private”;
}
}
4. 集合不可变实例工厂方法
在以前,我们想要创建一个不可变的集合,需要先创建一个可变集合,然后使用 unmodifiableSet 创建不可变集合。代码如下:
Set set = new HashSet<>();
set.add(“A”);
set.add(“B”);
set.add(“C”);
set = Collections.unmodifiableSet(set);
System.out.println(set);
Java 9 中提供了新的 API 用来创建不可变集合。
List list = List.of(“A”, “B”, “C”);
Set set = Set.of(“A”, “B”, “C”);
Map<String, String> map = Map.of(“KA”, “VA”, “KB”, “VB”);
5. 改进 try-with-resources
Java 9 中不需要在 try 中额外定义一个变量。Java 9 之前需要这样使用 try-with-resources:
InputStream inputStream = new StringBufferInputStream(“a”);
try (InputStream in = inputStream) {
in.read();
} catch (IOException e) {
e.printStackTrace();
}
在 Java 9 中可以直接使用 inputStream 变量,不需要再额外定义新的变量了。
InputStream inputStream = new StringBufferInputStream(“a”);
try (inputStream) {
inputStream.read();
} catch (IOException e) {
e.printStackTrace();
}
6. 多版本兼容 jar 包
Java 9 中支持在同一个 JAR 中维护不同版本的 Java 类和资源。
7. 增强了 Stream,Optional,Process API
8. 新增 HTTP2 Client
9. 增强 Javadoc,增加了 HTML 5 文档的输出,并且增加了搜索功能
10. 增强 @Deprecated
对 Deprecated 新增了 since 和 forRemoval 属性
11. 增强了钻石操作符 “<>”,可以在 匿名内部类中使用了。
在 Java 9 之前,内部匿名类需要指定泛型类型,如下:
Handler<? extends Number> intHandler1 = new Handler(2) {
}
而在 Java 9 中,可以自动做类型推导,如下:
Handler<? extends Number> intHandler1 = new Handler<>(2) {
}
12. 多分辨率图像 API:定义多分辨率图像API,开发者可以很容易的操作和展示不同分辨率的图像了。
13. 改进的 CompletableFuture API
CompletableFuture 类的异步机制可以在 ProcessHandle.onExit 方法退出时执行操作。
其他一些改进可参照 docs.oracle.com/javase/9/wh…
Java 10
1. 新增局部类型推断 var
var a = “aa”;
System.out.println(a);
var 关键字目前只能用于局部变量以及 for 循环变量声明中。
2. 删除工具 javah
从JDK中移除了 javah 工具,使用 javac -h 代替。
3. 统一的垃圾回收接口,改进了 GC 和其他内务管理
其他特性
-
ThreadLocal 握手交互
JDK 10 引入一种在线程上执行回调的新方法,很方便的停止单个线程而不是停止全部线程或者一个都不停。 -
基于Java的实验性JIT编译器
Java 10 开启了 Java JIT编译器 Graal,用作Linux / x64平台上的实验性JIT编译器。 -
提供默认的 CA 根证书
-
将 JDK 生态整合到单个仓库
此JEP的主要目标是执行一些内存管理,并将JDK生态的众多存储库组合到一个存储库中。
其他一些改进可以参照 www.oracle.com/technetwork…
Java 11
1. Lambda 表达式中使用 var
(var x, var y) -> x.process(y)
2. 字符串 API 增强
Java 11 新增了 一系列字符串处理方法,例如:
// 判断字符串是否为空白
" ".isBlank();
" Javastack “.stripTrailing(); // " Javastack”
" Javastack ".stripLeading(); // "Javastack "
3. 标准化 HttpClient API
4. java 命令直接编译并运行 java 文件,省去先 javac 编译生成 class 再运行的步骤
5. 增加对 TLS 1.3 的支持
其他一些改进可以参照 www.oracle.com/technetwork…
Java 12
switch 表达式
Java 12 以后,switch 不仅可以作为语句,也可以作为表达式。
private String switchTest(int i) {
最后
这份文档从构建一个键值数据库的关键架构入手,不仅带你建立起全局观,还帮你迅速抓住核心主线。除此之外,还会具体讲解数据结构、线程模型、网络框架、持久化、主从同步和切片集群等,帮你搞懂底层原理。相信这对于所有层次的Redis使用者都是一份非常完美的教程了。
整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断!!!
数据结构、线程模型、网络框架、持久化、主从同步和切片集群等,帮你搞懂底层原理。相信这对于所有层次的Redis使用者都是一份非常完美的教程了。
[外链图片转存中…(img-fDapGMZg-1715680602732)]
整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断!!!