본문 바로가기

Languages/JAVA

람다와 스트림

람다식

 : 메서드를 하나의 '식(expression)'으로 표현한 것.

   람다식은 함수를 간략하면서도 명확하게 표현할 수 있게 해준다.

   '익명함수'라고도 한다.

람다식 작성하기

 

람다식은 익명 클래스의 객체와 동등하다.

타입 f = (int a, int b) -> a > b ? a : b; //참조변수의 타입을 뭘로 해야 할까?

익명 객체의 주소를 f 라는 참조변수에 저장.

참조형이니까 클래스 또는 인터페이스가 가능하다.

그리고 람다식과 동등한 메서드가 정의되어 있는 것이어야 한다.

그래야 참조변수로 익명 객체의 메서드를 호출할 수 있기 때문이다.

 

556p 참고

 

컬렉션 프레임웍과 함수형 인터페이스

메서드 참조

하나의 메서드만 호출하는 람다식은

'클래스 이름 :: 메서드이름' 또는 '참조변수 :: 메서드이름' 으로 바꿀 수 있다.

 

스트림(stream)

 - 스트림은 데이터 소스로 부터 데이터를 일기만할 뿐, 데이터를 변경하지 않는다.

 - 스트림은 Iterator처럼 일회용이다.

 - 최종 연산이 수행되어야 비로소 스트림의 중간 연산을 거쳐 최종 연산에서 소모된다.

   중간연산( distinct, sort)

 - 병렬 처리가 쉽다. parallel()

 

 

스트림의 연산

 : 연산은 중간연산과 최종연산으로 분류.

   중간연산은 연산결과를 스트림으로 반환하기 때문에 중간 연산을 연속해서 연결할 수 있다.

   반면 최종 연산은 스트림의 요소를 소모하면서 연산을 수행하므로 단 한번만 연산이 가능하다.

 

	String[] str = {"aaa","bbb","ccc"};
        Stream<String> str1 = Stream.of(str);
        Stream<String> distinct = str1.distinct();
        Stream<String> sorted = distinct.sorted();
        Stream<String> limit = sorted.limit(3);
        long count = limit.count();

 

중간연산

 skip(3) : 처음 3개의 요소를 건너뛴다.

 limit(5) : 스트림의 요소를 5개로 제한한다.

 filter() : 주어진 조건에 맞지 않는 요소를 걸러낸다.

 distinct() : 중복된 요소들을 제거한다. 

 sorted() : 정렬.

 comparing()

 

 map() : 스트림의 요소에 저장된 값 중에서 원하는 필드만 뽑아내거나 특정 형태로 변환해야 할 때 사용한다.

 

 peek() : 연산과 연산 사이에 올바르게 처리되었는지 확인할 때 사용.

         forEach와 달리 요소를 소모하지 않으므로 연산 사이에 여러번 끼워 넣어도 문제가 되지 않는다.

 flatMap() : Stream <T[]> 을 Stream<T> 로 변환해야 할 때 사용.

 

Optional<T>

 : 'T타입의 객체'를 감싸는 래퍼 클래스.

   Optional타입의 객체에는 모든 타입의 객체를 담을 수 있다. 

 

 get() : 저장된 값 반환. 없으면 nullException.

 orElse("abc") : 저장된 값 반환. 없으면 abc 반환.

 orElseGet(람다식) : orElse 동일.

 orElseThrow(람다식) : null이면 지정한 예외 발생.

 isPresent() : 옵셔널객체의 값이 null이면 false, 있으면 true.

 ifPresent(람다식) : 있으면 람다식 실행, 없으면 아무일도 하지 않음.

 

 

최종연산

 : 스트림의 요소를 소모하여 결과를 만들어낸다.

 

 forEach() : 스트림의 요소 출력.

 xxxMatch() : 조건검사 boolean타입 반환

 findFirst() : 조건에 일치하는 첫 번째 요소 반환.

 findAny() : 조건에 일치하는 요소를 하나 반환(병렬 스트림)

 reduce() : 

 

 

'Languages > JAVA' 카테고리의 다른 글

네트워킹  (0) 2020.04.20
입출력 I/O  (0) 2020.04.18
Java 쓰레드 (진행중)  (0) 2020.04.09
열거형(enum), 어노테이션  (0) 2020.04.08
Java 제네릭스(Generics)  (0) 2020.04.08