5.6 练习

1.方法引用

回顾第3章中的例子,使用方法引用改写以下方法:

a. 转换大写的map方法;

b. 使用reduce实现count方法;

c. 使用flatMap连接列表。

2.收集器

a. 找出名字最长的艺术家,分别使用收集器和第3章介绍过的reduce高阶函数实现。然后对比二者的异同:哪一种方式写起来更简单,哪一种方式读起来更简单?以下面的参数为例,该方法的正确返回值为"Stuart Sutcliffe"

  1. `Stream<String> names = Stream.of("John Lennon", "Paul McCartney",
  2. "George Harrison", "Ringo Starr", "Pete Best", "Stuart Sutcliffe");

b. 假设一个元素为单词的流,计算每个单词出现的次数。假设输入如下,则返回值为一个形如[John → 3, Paul → 2, George → 1]的Map

  1. Stream<String> names = Stream.of("John", "Paul", "George", "John",
  2. "Paul", "John");

c. 用一个定制的收集器实现Collectors.groupingBy方法,不需要提供一个下游收集器,只需实现一个最简单的即可。别看JDK的源码,这是作弊!提示:可从下面这行代码开始:

public class GroupingBy implements Collector>, Map>>

这是一个进阶练习,不妨最后再尝试这道习题。

3.改进Map

使用MapcomputeIfAbsent方法高效计算斐波那契数列。这里的“高效”是指避免将那些较小的序列重复计算多次。