본문 바로가기

JAVA/JAVA 8

(7)
자바 8 #스트림(Stream) 종류와 함수형 인터페이스 기본 타입 스트림정수를 래퍼 객체로 감싸는 일이 명백히 비효율적인데도 불구하고 정수들을 Stream로 모았다.래퍼 객체의 비효율성은 다른 기본타입인 double, float, long, short, char, byte, boolean의 경우도 마찬가지다.스트림 라이브러리는 기본 타입 값들을 직접 저장하는 데 특화된 타입인 IntStream, LongStream, DoubleStream을 포함한다.short, char, byte, boolean 타입을 저장할려면 IntStream을 사용하고, float인 경우는 DoubleStream을 사용한다.라이브러리 설계자들은 이들 나머지 5개 스트림 타입을 추가할 가치가 있다고 생각하지 않았다. IntStream을 생성하려면 IntStream.of 와 Arrays...
자바 8 #스트림(Stream) 관련 메서드 filter, map, flatMap 메서드스트림 변환은 한 스트림에서 데이터를 읽고, 변환된 데이터를 다른 스트림에 넣는다.이미 특정 조건과 일치하는 모든 요소를 담은 새로운 스트림을 돌려주는 filter변환 List wordList = ...;Stream words = worlList.stream();Stream longWords = words.filter(w -> w.length() > 12); filter의 인자는 Predicate, 즉 T를 받고 boolean을 리턴하는 함수이다.스트림에 있는 값들을 특정 방식으로 변환하고 싶을 때는 map메서드를 사용하고 변환을 수행하는 함수를 파라미터로 전달한다.예) 모든 단어를 소문자로 변환Stream lowercaseWords = words.map(Str..
자바 8 #스트림(Stream) 스트림스트림은 자바8에서 연산의 스케줄링은 구현체에 맡기며, 값들의 묶음을 처리하고 원하는 작업을 지정하는데 필요한 핵심 추상화이다.예) 특정 메서드에서 리턴하는 값들의 평균을 계산하려고 한다면각 요소를 대상으로 해당 메서드를 호출하여 이 값들의 평균을 얻고 싶다고 명시한다.각 부분의 합계와 카운트를 계산하고 결과를 합치기 위해 다중 스레드를 사용해 연산을 병렬화하는 일을 스트림 라이브러리에 맡긴다. 스트림컬렉션을 처리할 때 보통은 요소들을 순회하면서 각 요소를 대상으로 작업한다.String contents = new String(Files.readAllBytes(Paths.get("c:\\alice.txt")), StandardCharsets.UTF_8); //파일을 문자열로 읽어온다.List word..
자바8 #인터페이스 디폴트 메서드와 정적메서드 디폴트 메서드많은 프로그래밍 언어에서 함수 표현식을 컬렉션 라이브러리와 통합한다.이는 종종 루프를 이용한 버전보다 짧고 이해하기 쉬운 코드로 이어진다.예) for(int i =0; i
자바8 람다 #레퍼런스 메서드 레퍼런스다른 코드에 전달하려고 하는 액션을 수행하는 메서드가 이미 존재할 수도 있다.예) 버튼을 클릭할때마다 단순히 이벤트 객체를 출력하고 싶을 경우button.setOnAction(event -> System.out.println(event)); 하지만 setOnAction 메서드에 println 메서드만 전달할 수 있다면 더 좋을것이다.button.setOnAction(System.out::println); System.out::println 표현식은 람다 표현식 x -> System.out.println(x) 에 해당하는 메서드 레퍼런스(method reference)이다 예) 대소문자를 가리지 않고 문자열을 정렬하고 싶은 경우Arrays.sort(strings, String::compare..
자바8 람다 #함수형 인터페이스 함수형 인터페이스자바에는 Runnable, Comparator 등 코드 블록을 캡슐화하는 수많은 기존 인터페이스가 있다.람다는 이러한 기존 인터페이스와 호환된다. 단일 추상메서드(single abstract method)를 갖춘 인터페이스의 객체를 기대할 때 람다 표현식을 사용할 수 있다.그리고 이러한 인터페이스를 함수형인터페이스(functional interface)라고 한다. 함수형 인터페이스가 단일 추상 메서드를 포함해야하는 이유는?인터페이스에 있는 모든 메서드는 추상 메서드이다. 실제로 언제나 인터페이스에서 toString이나 clone 같은 Object 클래스의 메서드를 재선언할 수 있었고, 이러한 재선언은 해당 메서드를 추상메서드로 만들지 않는다.자바8에서는 인터페이스에 비추상 메서드를 정의할..
자바8 람다 람다lambda expression 람다 표현식은 나중에 한번 이상 실행할 수 있도록 전달할 수 있는 코드 블록이다. 지금까지 자바에서 코드블록class Worker implements Runnable {public void run() {for(int i=0; i 표현식)(String first, String second) -> Integer.compare(first.length(), second.length()) 이와 같은 표현식은 단순한 코드 블록으로, 변수들의 명세와 함게 코드에 전달해야 한다. 2) 표현식 하나로 표현할 수 없는 계산을 수행한다면? 중괄호 {}로 감싸고 명시적인 return 문을 사용한다.(String first, String second) -> {if(first.length() ..