纠错与更改所有文章的图床

This commit is contained in:
Dragon
2021-03-22 20:01:15 +08:00
parent cdb811a48a
commit bf0d1bcccd
27 changed files with 767 additions and 642 deletions

View File

@@ -5,12 +5,11 @@ tags:
- JDK8
- 新特性
categories:
- Java
- Java基础
- 新特性
keywords: Java8新特性JDK8
description: 详解JDK8出现的新特性。
cover: 'https://cdn.jsdelivr.net/gh/youthlql/lql_img/Java_Basis/logo.png'
top_img: 'https://cdn.jsdelivr.net/gh/youthlql/lql_img/blog/top_img.jpg'
cover: 'https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/Java_Basis/logo.png'
abbrlink: de3879ae
date: 2020-10-19 22:15:58
---
@@ -21,7 +20,7 @@ date: 2020-10-19 22:15:58
> 本篇文章只讲解比较重要的
<img src="https://cdn.jsdelivr.net/gh/youthlql/lql_img/Java_Basis/Java8_New_Features/0001.png">
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/Java_Basis/Java8_New_Features/0001.png">
@@ -112,12 +111,15 @@ import java.util.function.Consumer;
* 3. Lambda表达式的使用分为6种情况介绍
* <p>
* 总结:
* ->左边lambda形参列表的参数类型可以省略(类型推断)如果lambda形参列表只有一个参数其一对()也可以省略
* ->右边lambda体应该使用一对{}包裹如果lambda体只有一条执行语句可能是return语句省略这一对{}和return关键字
* ->左边lambda形参列表的参数类型可以省略(类型推断)如果lambda形参列表只有一个参数其一对()也
* 可以省略
* ->右边lambda体应该使用一对{}包裹如果lambda体只有一条执行语句可能是return语句省略这一
对{}和return关键字
* <p>
* 4.Lambda表达式的本质作为函数式接口的实例
* <p>
* 5. 如果一个接口中,只声明了一个抽象方法,则此接口就称为函数式接口。我们可以在一个接口上使用 @FunctionalInterface 注解,
* 5. 如果一个接口中,只声明了一个抽象方法,则此接口就称为函数式接口。我们可以在一个接口上
使用 @FunctionalInterface 注解,
* 这样做可以检查它是否是一个函数式接口。
* <p>
* 6. 所以以前用匿名实现类表示的现在都可以用Lambda表达式来写。
@@ -306,13 +308,13 @@ public class LambdaTest1 {
**核心函数式接口**
<img src="https://cdn.jsdelivr.net/gh/youthlql/lql_img/Java_Basis/Java8_New_Features/0002.png">
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/Java_Basis/Java8_New_Features/0002.png">
**其它函数式接口**
<img src="https://cdn.jsdelivr.net/gh/youthlql/lql_img/Java_Basis/Java8_New_Features/0003.png">
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/Java_Basis/Java8_New_Features/0003.png">
@@ -900,7 +902,7 @@ Stream到底是什么呢
<img src="https://cdn.jsdelivr.net/gh/youthlql/lql_img/Java_Basis/Java8_New_Features/0004.png">
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/Java_Basis/Java8_New_Features/0004.png">
@@ -999,7 +1001,10 @@ public class StreamAPITest1 {
list.stream().limit(3).forEach(System.out::println);
System.out.println();
// skip(n) —— 跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则返回一个空流。与 limit(n) 互补
/*
skip(n) —— 跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,
则返回一个空流。与 limit(n) 互补
*/
list.stream().skip(3).forEach(System.out::println);
System.out.println();
@@ -1019,7 +1024,10 @@ public class StreamAPITest1 {
//映射
@Test
public void test2(){
// map(Function f)——接收一个函数作为参数,将元素转换成其他形式或提取信息,该函数会被应用到每个元素上,并将其映射成一个新的元素。
/*
map(Function f)——接收一个函数作为参数,将元素转换成其他形式或提取信息,该函数会被应
用到每个元素上,并将其映射成一个新的元素。
*/
List<String> list = Arrays.asList("aa", "bb", "cc", "dd");
list.stream().map(str -> str.toUpperCase()).forEach(System.out::println);
@@ -1035,8 +1043,10 @@ public class StreamAPITest1 {
s.forEach(System.out::println);
});
System.out.println();
// flatMap(Function f)——接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。
//flatMap一层遍历即可拿到想要的结果
/*
flatMap(Function f)——接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连
接成一个流。flatMap一层遍历即可拿到想要的结果
*/
Stream<Character> characterStream = list.stream().flatMap(StreamAPITest1::fromStringToStream);
characterStream.forEach(System.out::println);
@@ -1171,7 +1181,7 @@ public class StreamAPITest2 {
//3-收集
@Test
public void test4(){
// collect(Collector c)——将流转换为其他形式。接收一个 Collector接口的实现用于给Stream中元素做汇总的方法
// collect(Collector c)——将流转换为其他形式。接收一个 Collector接口的实现用于给Stream中元素做汇总的方法
// 练习1查找工资大于6000的员工结果返回为一个List或Set
List<Employee> employees = EmployeeData.getEmployees();
@@ -1209,7 +1219,7 @@ public class StreamAPITest2 {
## 常用API
<img src="https://cdn.jsdelivr.net/gh/youthlql/lql_img/Java_Basis/Java8_New_Features/0005.png">
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/Java_Basis/Java8_New_Features/0005.png">

View File

@@ -9,9 +9,8 @@ categories:
- 重难点
keywords: Java基础泛型
description: 万字长文详解Java泛型。
cover: 'https://cdn.jsdelivr.net/gh/youthlql/lql_img/Java_Basis/logo.png'
top_img: 'https://cdn.jsdelivr.net/gh/youthlql/lql_img/blog/top_img.jpg'
abbrlink: 1c342bc4
cover: 'https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/Java_Basis/logo.png'
abbrlink: adb2faf0
date: 2020-10-19 22:21:58
---
@@ -592,7 +591,8 @@ class GenerateTest<T> {
/**
* 1、在泛型类中声明了一个泛型方法使用泛型E这种泛型E可以为任意类型。可以类型与T相同也可以不同。
* 2、由于泛型方法在声明的时候会声明泛型<E>,因此即使在泛型类中并未声明泛型,编译器也能够正确识别泛型方法中识别的泛型。
* 2、由于泛型方法在声明的时候会声明泛型<E>,因此即使在泛型类中并未声明泛型,编译器也能够正确识别
泛型方法中识别的泛型。
*/
public <E> void show_3(E t) {
System.out.println(t.toString());
@@ -777,7 +777,8 @@ class Order<T> {
/**
* 2、泛型方法在方法中出现了泛型的结构泛型参数与类的泛型参数没有任何关系。换句话说
* 泛型方法所属的类是不是泛型类都没有关系。
* 3、泛型方法可以声明为静态的。原因泛型参数是在调用方法时确定的。并非在初始化类时确定,所以无所谓
* 3、泛型方法可以声明为静态的。原因泛型参数是在调用方法时确定的。并非在初始化类时确定,
* 所以无所谓
*/
public static <E> List<E> copyFromArrayToList(E[] arr){
@@ -1037,7 +1038,7 @@ class Dog extends Animal {
`test1()`在编译时就会飘红
<img src="https://cdn.jsdelivr.net/gh/youthlql/lql_img/Java_Basis/Generic/0001.png">
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/Java_Basis/Generic/0001.png">
@@ -1289,7 +1290,7 @@ public class Test_difference {
}
```
<img src="https://cdn.jsdelivr.net/gh/youthlql/lql_img/Java_Basis/Generic/0002.png">
<img src="https://cdn.jsdelivr.net/gh/youthlql/lqlp@v1.0.0/Java_Basis/Generic/0002.png">
### 区别3通配符可以使用超类限定而T不行
@@ -1382,7 +1383,7 @@ class D<T> {
Java中的泛型基本上都是在编译器这个层次来实现的在生成的Java字节码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数编译器在编译的时候去掉这个过程就称为类型擦除。
如在代码中定义的List<object>List<String>等类型在编译后都会编程ListJVM看到的只是List。而由泛型附加的类型信息对JVM来说是不可见的。Java编译器会在编译时尽可能的发现可能出错的地方但是仍然无法避免在运行时刻出现类型转换异常的情况。类型擦除也是Java的泛型实现方法与C++模版机制实现方式之间的重要区别。
如在代码中定义的`List<object>``List<String>`等类型在编译后都会编程ListJVM看到的只是List。而由泛型附加的类型信息对JVM来说是不可见的。Java编译器会在编译时尽可能的发现可能出错的地方但是仍然无法避免在运行时刻出现类型转换异常的情况。类型擦除也是Java的泛型实现方法与C++模版机制实现方式之间的重要区别。
可以通过两个例子来证明java泛型的类型擦除。