Files
Hui-s-notebook/Java8变化.md
2023-09-10 10:50:53 +08:00

148 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 使用Lambda表达式避免重复啰嗦代码
```java
// Java8之前比较两个苹果重量
Collections.sort(inventory, new Comparator<Apple>) {
public int compare(Apple a1, Apple a2){
return a1.getWeight().compareTo(a2.getWeight());
}
});
// Java8之后
invetory.sort(comparing(Apple::getWeight));
```
通过stream流支持许多处理数据的并行操作
### 流处理
linux中的流
```bash
# cat命令把两个文件连接起来创建一个流
# tr装换流中的字符串
# sort对流进行排序
# tail -3 给出流最后三行
# 通过|管道符连接在一起
cat file1 file2 | tr "[A-Z]" "[a-z]" | sort | tail -3
```
### 行为参数化传递代码给方法
把方法作为参数传递给另一个方法
### 并行与共享的可变数据
避免使用synchronized打破“不能有共享的可变数据”
## 函数
传统意义方法和类为二等公民,通过运行时传递将方法变为一等公民
### 方法和Lambda作为一等公民
方法引用
```java
// 筛选隐藏文件
File[] hiddenFiles = new File(".").listFiles(new FileFilter() {
public boolean accept(File file) {
return file.isHidden();
}
})
// Java8
File[] hiddenFiles = new File(".").listFiles(File::isHidden);
```
Lambda函数
(int x) -> x+1
### 传递代码
```java
// 筛选绿色苹果
public static List<Apple> fileterGreenApples(List<Apple> inventory) {
List<Apple> resutl = new ArrayList<>();
for (Apple apple: inventory) {
if ("green".equals(apple.getColor())) {
result.add(apple);
}
}
return result;
}
// 筛选重的苹果
public static List<Apple> fileterHeavyApples(List<Apple> inventory) {
List<Apple> resutl = new ArrayList<>();
for (Apple apple: inventory) {
if (apple.getWeight() > 150) {
result.add(apple);
}
}
return result;
}
// Java8
public static boolean isGreenApple(Apple apple) {
return "green".equals(apple.getColor());
}
public static boolean isHeavyApple(Apple apple) {
return apple.getWeight() > 150;
}
public interface Predicate<T>{
boolean test(T t);
}
static List<Apple> filterApples(List<Apple> inventory,
predicate<Apple> p) {
List<Apple> resutl = new ArrayList<>();
for (Apple apple: inventory) {
if (p.test(apple)) {
result.add(apple);
}
}
return result;
}
filterApples(inventory, Apple::isGreenApple);
filterApples(inventory, Apple::isHeavyApple);
```
### 从传递方法到Lambda
匿名函数
```java
filterApples(inventory, (Apple a) -> "green".equals(a.getColor()));
filterApples(inventory, (Apple a) -> a.getColor() > 150);
filterApples(inventory, (Apple a) -> a.getColor() < 80 ||
"brown".equals(a.getColor()));
```
## 流
```java
// 顺序处理:
import static java.util.stream.Collectors.toList;
List<Apple> heavyApples=
inventory.stream().filter((Apple a)-> a.getWeight() > 150)
.collect(toList());
//并行处理:
import static java.util.stream.Collectors.toList;
List<Apple> heavyApples=
inventory.parallelStream().filter((Apple a)-> a.getWeight() > 150)
.collect(toList());
```
## 默认方法
支持库设计师,写出更容易改进的接口。
给接口添加一个新方法,意味着所有的实体类都必须为其提供一个实现
## 函数式编程的其他好思想
通过使用更多描述性数据类型来避免null
结构(模式)匹配