java8 旨在用更少时间写出更简洁,更清晰的代码。并且充分利用多核处理器并行能力
java 8 提供了Lambda表达式和方法引用,旨在简明的将代码和方法作为参数传递进方法。Stream流,旨在提供声明式编程替代过程式编程极大简化代码。还有其他特性如Optional,默认方法,CompletableFuture,以及新的日期和时间API。
java8新增核心特性:
1. Lambda与方法引用
Lambda表达式与方法引用是对匿名函数的改进,旨在简化代码,并且与Stream API 结合使其Stream流式编程成为可能。
// 原先使用匿名函数,写了很多与逻辑无关的代码
List<apples> apples = new ArrayList<>();
apples.sort(new Comparator<Apple>() {
public int compare(Apple a1, Apple a2){
return a1.getWeight().compareTo(a2.getWeight());
}
};
)
//使用Lambda表达式,去除了冗余代码,只传递了比较两个苹果重量所真正需要的代码,代码更加清晰简单了。
apples.sort((Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()));
//使用方法引用,更加简洁,表示通过比较苹果重量来排序
apples.sort(Comparator.comparing(Apple:getWeight));
2. Stream流
Stream流是对集合的改进,Stream API将传统的命令式编程转换为声明式编程,将怎么做转换为做什么,组合各种操作生成流水线,单次遍历完成所有操作,旨在简化代码,提高开发效率,并且利用并发流可对大型数据集进行并发处理,充分利用多核CPU的处理
// 未使用Stream,对地址进行分类
List<Address> addressList = new ArrayList<>();
Map<String, List<Address>> addressMap = new HashMap();
for (Address address : addressList) {
if (!addressMap.containsKey(address.getUserId())) {
List<Address> list = new ArrayList<>();
list.add(address);
addressMap.put(address.getUserId(), list);
} else {
addressMap.get(address.getUserId()).add(address);
}
}
//使用Stream,对地址分类
Map<String, List<Address>> addressMap = addressList.stream()
.collect(Collectors.groupingBy(Address::getUserId));
3. ComputableFuture接口
ComputableFuture是对Future接口的改进,使用CompletableFuture能简化异步编程,并且处理各种复杂的异步编程情况。ComputableFuture对Future接口的改进就像Stream流对集合的改进。
public void test(String[] args) throws InterruptedException, ExecutionException, TimeoutException {
ExecutorService executorService = Executors.newCachedThreadPool();
//Future版
Future<Long> future = executorService.submit(new Callable<Long>() {
@Override
public Long call() throws Exception {
return doWasteTimeThing();
}
});
doOtherThing();
future.get(1, TimeUnit.SECONDS);
//CompletableFuture版
CompletableFuture<Long> completableFuture = CompletableFuture.supplyAsync(() -> doWasteTimeThing(), executorService);
doOtherThing();
completableFuture.get(1, TimeUnit.SECONDS);
}
private long doWasteTimeThing() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return new Random().nextLong();
}
private void doOtherThing() {
System.out.println("do other thing");
}
4. Optional类
Optional<T>是对null的改进,使用Optional<T>使其程序员更好的注意到空值情况,避免NullPointerException异常
5. 默认方法
默认方法用于增加接口能力,在不会破坏现有的代码,接口的使用者无需去提供实现屏蔽了接口中将来的变化对用户的影响,帮助类库设计者编写更易扩展的接口, 通过Default标记
6. 新的时间和日期API
新的时间和日期API是对原有的Date和Calendar的改进,为解决Date和Calendar的部分问题而引进的
网友评论