https://www.gravatar.com/avatar/8e10df0bad4c56b3464cd715f8d96c46?s=240&d=mp

重构、测试和调试

重构以提高可读性和灵活性

提高代码的可读性

我们介绍三个简单的重构,使用lambda、方法引用和流,将它们应用到代码中,以提高代码的可读性:

  • 将匿名类重构为lambda表达式
  • 将lambda表达式重构为方法引用
  • 将命令式数据处理重构为流处理

从匿名类到lambda表达式

下面是使用匿名类创建一个Runnable对象和对应的lambda表达式:

Collection API增强

Collection工厂

Java 9引入了一些创建小型集合对象的方法,比如Arrays.asList()

List<String> friends = Arrays.asList("Raphael", "Olivia", "Thibaut");

Arrays.asList()返回一个固定大小的列表,可以对其进行更新,但不能添加或删除元素,否则抛出UnsupportedModificationException异常。

并行数据处理和性能

并行流

通过调用parallelStream方法,可以将集合转换为并行流。并行流是将元素分割成多个块的流,使用不同的线程处理每个块。因此,你可以自动划分指定操作的工作负载在多核处理器的所有核心上,并使它们一样忙。

使用流收集数据

假设有一个事务列表,你希望根据货币对它们进行分组。在Java 8之前,即使是这样一个简单的例子也很难实现,如下所示:

Map<Currency, List<Transaction>> transactionsByCurrencies = new HashMap<>();
for (Transaction transaction : transactions) {
    Currency currency = transaction.getCurrency();
	List<Transaction> transactionsForCurrency = transactionsByCurrencies.get(currency);
	if (transactionsForCurrency == null) {
		transactionsForCurrency = new ArrayList<>();
		transactionsByCurrencies.put(currency, transactionsForCurrency);
	}
	transactionsForCurrency.add(transaction);
}

在Java 8之后,仅用一条语句就可以获得完全相同的结果:

使用流

过滤

使用谓词过滤

filter方法接受一个谓词函数为参数,并返回包含所有匹配谓词的元素的流。如下例:

List<Dish> vegetarianMenu = menu.stream().filter(Dish::isVegetarian).collect(toList());

如下图所示:

/images/2019/07/11/filter.png