06 Runnable에서 검사 예외를 다뤄야 하는 점이 싫지 않은가? 모든 검사 예외를 잡아내서 비검사 예외로 바꾸는 uncheck 메서드를 작성하라. 예를 들면, 다음과 같이 사용할 것이다.
new Thread (uncheck(
() -> { System.out.println("Zzz"); Thread.sleep(1000);})).start();
// 여길 보자. catch (InterruptedException) 부분이 없다!
힌트: run 메서드에서 모든 예외를 던질 수 있는 RunnableEx라는 인터페이스를 정의한다. 다음으로 public static Runnable uncheck(RunnableEx runner)를 구현한다. uncheck 함수 안에서 람다 표현식을 사용한다.
RunnableEx 대신 단순히 Callable<Void>를 사용할 수 없는 이유는 무엇인가?
07 Runnable 인스턴스 두 개를 파라미터로 받고, 첫 번째 인스턴스를 실행한 후 두 번째를 실행하는 Runnable을 리턴하는 andThen이라는 정적 메서드를 작성하라. main 메서드에서 andThen 호출에 람다 표현식 두 개를 전달하고, 결과로 받은 인스턴스를 실행하라.
08 람다 표현식이 다음과 같은 향상된 for 루프에 있는 변수를 캡처할 때 무슨 일이 일어나는가?
String[] names = { "Peter", "Paul", "Mary" };
List<Runnable> runners = new ArrayList<>();
for (String name : names)
runners.add(() -> System.out.println(name));
규칙에 맞는 작업인가? 각 람다 표현식이 다른 값을 캡처하는가, 아니면 모두 마지막 값을 얻는가? 만일 전통적인 루프인 for (int i = 0; i < names.length; i++)를 사용하면 무슨 일이 일어나는가?