01 : 반복에서 스트림 연산으로컬렉션을 처리할 때 보통은 요소들을 순회하며 값에 접근한다. 예를 들면 책에서 모든 긴 단어의 수를 고려하는 예제를 살펴보자 123String contents = new String(Files.readAllBytes( Paths.get("alice.txt")), StandardCharsets.UTF_8);List words = Arrays.asList(contents.split("[\\P{L}]+")); "alice.txt"에 있는 단어를 words 리스트에 넣었다. 1234int count = 0;for(String w : words){ if(w.length() > 12) count++;} 단어의 길이가 12이상인 단어의 개수를 세는 전통적인 순회 방식이다. 하지만 이 ..
08 : 인터페이스의 정적 메서드 일반적으로 인터페이스를 동반하는 클래스들에 정적 메서드를 두었다. 자바 표준 라이브러리에서 Collection/Collections 또는 Path/Paths 같은 인터페이스와 유티리티 클래스 쌍이 대표적이다. Paths 클래스를 살펴보자. 이 클래스는 몇 가지 팩토리 메서드(Factory method)만 포함하고 있다. Paths.get("jdk1.8.0", "jre", "bin")처럼 일련의 문자열로부터 경로(Path)를 만들 수 있다. 자바 8에서는 Path 인터페이스에 이 메서드를 추가할 수도 있었다. 123456public interface Path{ public static Path get(String first, String ... more){ return F..
06 : 변수 유효 범위 람다 표현식에 유효한 변수에 접근하고자 할때는 어떻게 할까? 다음 예제를 한번 보자 123456789public static void repeatMessage(String text, int count){ Runnable r = () ->{ for (int i = 0; i { while(count > 0) { count--; //오류 : 캡처한 변수는 변경 불가능 System.out.println(text); Thread.yield(); } }; new Thread(r).start();} 람다 표현식에서 변수를 변경하는 작업은 스레드에 안전하지 않다. 일변의 병행 작업이 존재 하고, 각 작업에서 공유 카운트를 업데이트 한다면 문제가 생길 것이다. 12345int matches = ..
05 : 생성자 레퍼런스생성자 레퍼런스 사용 방식메서드의 이름이 new라는 점을 제외 하면 메서드 레퍼런스와 사용 방식이 유사하다. 예를 들면, Button::new는 Button 생성자를 가리키는 레퍼런스이다. 하지만 어느 생성자를 가르키는지는 문맥에 따라 다르다고 한다. 123List labels = ...;Stream stream = labels.stream().map(Button::new);List buttons = stream.collect(Collectors.toList()); 문자열 리스트가 있다고 하면, 다음과 같은 호출을 이용해 각 문자열을 대상으로 생성자를 호출 함으로써 문자열 리스트를 버튼 배열로 변환한다. map 메서드가 리스트의 각 요소를 대상으로 Button(String) 생성자..
04 : 메서드 레퍼런스메서드 레퍼런스 사용방식 다른 코드에 전달하려는 액션을 수행하는 메서드가 이미 존재할 수 도 있다. 예를 들면, 버튼을 클릭할때 마다 단순히 이벤트 객체를 출력하고 싶은 경우이다. 1button.setOnAction(event -> System.out.println(event)); 하지만 setOnAction 메서드에 println 메서드만 전달할 수 있다면 더 간편할 것이다. 1button.setOnAction(System.out::println); System.out::println 표현식은 x -> System.out.println(x)에 해당하는 메서드 레퍼런스 이다. :: 연산자를 이용해 객체 또는 클래스와 메서드 이름을 구분하며 사용한다. 1. object::instan..
03 : 함수형 인터페이스 함수형 인터페이스(Functional Interface) 람다 표현식은 단일 추상 메서드를 갖춘 인터페이스 객체에 사용 가능 하다. 이러한 인터페이스를 함수형 인터페이스(Functional Interface)라 한다. Arrays.sort 메서드를 고려해 보면 두 번째 파라미터는 단일 메서드를 갖춘 인터페이스인 Comparator의 인스턴스를 필요로 한다. 기존의 구현 방식은 다음과 같다. 1234567class ComparatorTest implements Comparator{ public int compare(String first , String second){ return Integer.compare(first.length(), second.length()); }} Ar..
02 : 람다 표현식 문법 람다 표현식 첫 번째 : 12(String first, String second) -> Integer.compare(first.length(), second.length()) 위의 코드 처럼 변수들의 타입이 정확히 명시된 형태이다. ("매개변수") -> { "함수의 몸통"} 인 구조로 이루어 진다. 이때 함수의 형태가 Anonymous function 형태임을 기억해 두자. 자바의 기존의 Anonymous class 와 유사 한 형태로 사용하면 될 것 같다. 람다 표현식 두 번째 : 람다 표현식이 파라미터를 받지 않으면, 기존 함수와 마찬가지로 파라미터가 없는 메서드처럼 빈 괄호를 사용한다. 1() -> { for(int i = 0 ; i Integer.compare(first..