2.7 练习

每章最后都附有一组练习,帮助读者实践并巩固本章的知识和新概念。练习答案可在GitHub(https://github.com/RichardWarburton/java-8-Lambdas-exercises)上本书所对应的代码仓库中找到。

1.请看例2-15中的Function函数接口并回答下列问题。

例2-15 Function函数接口

  1. public interface Function<T, R> {
  2. R apply(T t);
  3. }

a. 请画出该函数接口的图示。

b. 若要编写一个计算器程序,你会使用该接口表示什么样的Lambda表达式?

c. 下列哪些Lambda表达式有效实现了Function

  1. x -> x + 1;
  2. (x, y) -> x + 1;
  3. 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接口:

  1. JButton button = new JButton();
  2. button.addActionListener(event ->
  3. System.out.println(event.getActionCommand()));

c. 以如下方式重载check方法后,还能正确推断出check(x -> x > 5)的类型吗?

  1. interface IntPred {
  2. boolean test(Integer value);
  3. }
  4. boolean check(Predicate<Integer> predicate);
  5. boolean check(IntPred predicate);

2.7 练习 - 图1 你可能需要查阅Javadoc或在IDE里查看方法的参数类型,验证重载是否有效。