2.7 练习
每章最后都附有一组练习,帮助读者实践并巩固本章的知识和新概念。练习答案可在GitHub(https://github.com/RichardWarburton/java-8-Lambdas-exercises)上本书所对应的代码仓库中找到。
1.请看例2-15中的Function函数接口并回答下列问题。
例2-15 Function函数接口
public interface Function<T, R> {R apply(T t);}
a. 请画出该函数接口的图示。
b. 若要编写一个计算器程序,你会使用该接口表示什么样的Lambda表达式?
c. 下列哪些Lambda表达式有效实现了Function?
x -> x + 1;(x, y) -> x + 1;x -> x == 1;
2.ThreadLocal Lambda表达式。Java有一个ThreadLocal类,作为容器保存了当前线程里局部变量的值。Java 8为该类新加了一个工厂方法,接受一个Lambda表达式,并产生一个新的ThreadLocal对象,而不用使用继承,语法上更加简洁。
a. 在Javadoc或集成开发环境(IDE)里找出该方法。
b. DateFormatter类是非线程安全的。使用构造函数创建一个线程安全的DateFormatter对象,并输出日期,如“01-Jan-1970”。
3.类型推断规则。下面是将Lambda表达式作为参数传递给函数的一些例子。javac能正确推断出Lambda表达式中参数的类型吗?换句话说,程序能编译吗?
a. Runnable helloWorld = () -> System.out.println("hello world");
b. 使用Lambda表达式实现ActionListener接口:
JButton button = new JButton();button.addActionListener(event ->System.out.println(event.getActionCommand()));
c. 以如下方式重载check方法后,还能正确推断出check(x -> x > 5)的类型吗?
interface IntPred {boolean test(Integer value);}boolean check(Predicate<Integer> predicate);boolean check(IntPred predicate);
你可能需要查阅Javadoc或在IDE里查看方法的参数类型,验证重载是否有效。
