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

3.2 KiB
Raw Permalink Blame History

使用Lambda表达式避免重复啰嗦代码

// 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中的流

# cat命令把两个文件连接起来创建一个流
# tr装换流中的字符串
# sort对流进行排序
# tail -3 给出流最后三行
# 通过|管道符连接在一起
cat file1 file2 | tr "[A-Z]" "[a-z]" | sort | tail -3

行为参数化传递代码给方法

把方法作为参数传递给另一个方法

并行与共享的可变数据

避免使用synchronized打破“不能有共享的可变数据”

函数

传统意义方法和类为二等公民,通过运行时传递将方法变为一等公民

方法和Lambda作为一等公民

方法引用

// 筛选隐藏文件
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

传递代码

// 筛选绿色苹果
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

匿名函数

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()));

// 顺序处理:

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

结构(模式)匹配