본문 바로가기
Java/Java의 정석 by 남궁성

람다식과 스트림

by 구너드 2023. 6. 15.

람다식

메서드를 하나의 식으로 표현한 것, 함수를 간략하면서도 명확하게 표현할 수 있게 해준다.

    int method (int i) {
        return (int)(Math.random()*5) + 1;
    }

    int[] arr = new int[5];
    Arrays.setAll(arr, (i) -> (int)(Ma random() * 5) + 1);

일반적인 메서드와 이를 람다식으로 재구성한 것

모든 메서드는 클래스에 포함되어야 하므로 클래스도 새로 만들어야하고 객체도 생성해야지만 메서드를 호출할 수 있다. 그러나 람다식은 이 모든 과정없이 오직 람다식 자체만으로도 메서드의 역할을 대신할 수 있다.

람다식을 작성하기 위해서는 메서드에서 이름과 반환타입을 제거하고 매개변수 선언부와 블럭 사이에  ->를 추가하면 된다.


함수형 인터페이스

정확히 말해서 람다식은 익명 객체다. 때문에 참조변수가 있어야 객체의 메서드를 호출할 수 있는데 여기서 사용되는 것이 바로 함수형 인터페이스. 함수형 인터페이스는 람다식과 인터페이스의 메서드가 1:1로 연결될 수 있게 단 하나의 추상 메서드만 정의되어야 한다. 

 

함수형 인터페이스 메서드 설명
java.lang.Runnable void run() 매개변수 X ,반환값 X
Supplier<T> T get() 매개변수 X,반환값 O
Consumer<T> void accept(T t) 매개변수 O, 반환값 X
Function<T, R> R apply(T t) 한 개의 메개변수,  반환값 O
Predicate<T> boolean test(T t) 조건식 표현, 한 개의 메개변수, 
반환타입 boolean
BiConsumer<T, U> void accept(T t, U u) 두 개의 매개변수, 반환값 X
BiPredicate<T, U> boolean test(T t, U u) 조건식 표현, 두 개의 매개변수,
반환타입 boolean
BiFunction<T, U, R> R apply(T t, U u) 두 개의 매개변수, 반환값 Ox

T = Type, R = Return Type


메서드 참조

람다식이 하나의 메서드만 호출하는 경우에는 메서드 참조라는 방법으로 람다식을 간략하게 할 수 있다.

EX) 문자열을 정수로 변환하는 람다식

    Function<String, Integer> f = (String s) -> Integer.parseInt(s);
    Function<String, Integer> f1 = Integer::parseInt;

두 람다식 모두 같은 기능을 가지고 있다.

하나의 메서드만 호출하는 람다식은 클래스이름::메서드이름 또는 참조변수::메서드이름으로 바꿀 수 있다.


스트림

데이터 소스를 추상화하고 데이터를 다루는데 자주 사용되는 메서드들을 정의.

데이터 소스를 추상화하였다는 것은 데이터 소스가 무엇이던 간에 같은 방식으로 다룰 수 있게 되었다는 것

코드의 재사용성이 높아진다는 것

    String[] strArr = {"aaa", "bbb", "ccc"};
    List<String> strList = Arrays.asList(strArr);
    
    Stream<String> StrStream1 = strList.stream();
    Stream<String> StrStream2 = Arrays.stream(strArr);

 

스트림의 특징

원본 데이터 소스를 변경하지 않는다

작업을 내부 반복으로 처리한다.

지연된 연산을 시행한다

병렬 스트림으로 사용할 수 있다

일회용이다.

 

스트림의 형태

stream.중간연산.최종연산


람다식과 스트림을 공부하면서 느낀 건 직접 코드를 작성해보면서 이를 사용해보고 익히는 게 더 도움이 될 것 같다는 점이다. 따라서 람다와 스트림은 보다 코드를 작성해보고 이를 익혀보는 방향으로 공부하고자한다.

'Java > Java의 정석 by 남궁성' 카테고리의 다른 글

쓰레드 2  (2) 2023.06.06
쓰레드 1  (0) 2023.06.05
지네릭스, 열거형  (0) 2023.05.29
컬렉션 프레임워크 2  (0) 2023.05.26
컬렉션 프레임워크 1  (0) 2023.05.25