더북(TheBook)

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++)를 사용하면 무슨 일이 일어나는가?

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.