Lambda, Stream

ymk·2023년 6월 13일
0
post-thumbnail

🗝️ Lambda

자바 1.8부터 람다식(Lambda) 가 추가되면서 자바는 객체지향언어인 동시에 함수형 언어가 되었다. 람다식(Lambda Expression)은 메서드를 하나의 으로 표현한 것이라고 할 수 있다. 메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어지므로 익명 함수(anonymous function)라고도 한다.

// 메소드
int max(int a, int b) {
	return a > b ? a : b;
}

// 람다식1
(int a, int b) -> { return a > b ? a : b; }

// 람다식2
(int a, int b) -> a > b ? a : b

// 람다식3
(a, b) -> a > b ? a : b

📈 함수형 인터페이스(Functional Interface)

함수형 인터페이스(Functional Interface)란 추상 메소드가 오직 하나인 인터페이스를 뜻한다. 하지만 static methoddefault method는 여러개가 존재해도 괜찮다. 또한 @FunctionalInterface라는 어노테이션을 이용하면 해당 인터페이스가 함수형 인터페이스인지 검사해준다.
이러한 Functional Interface의 메소드를 람다식으로 재정의하여 사용한다.

Funtional Interface 예시

@FunctionalInterface
interface MyInterface<T> {
	T myMethod();
    
    default void getDefault() {
    	System.out.println("Default");
    }
    
    static void getStatic() {
    	System.out.println("Static");
    }
}

사용 예시

MyInterface<String> myInterface = () -> "Hello";

// abstract
String s = myInterface.myMethod();
System.out.println(s);

// default
myInterface.getDefault();

// static
myInterface.getStatic();

📄 java.util.function 패키지 - Functional Interface 종류

  • Runnable - 실행시키는 용도
  • Supplier - 데이터 생성
  • Consumer - 데이터 사용
  • Function - 타입 변환
  • Predicate - 조건식


🌫️ Stream

이전까지는 많은 수의 데이터를 다룰 때, 컬렉션 또는 배열에 데이터를 담고 원하는 결과를 얻기 위해 for문과 Iterator를 이용해서 코드를 작성했다. 하지만 이런 방식은 길고 재사용이 어렵다는 단점이 있다. 이러한 단점을 보완하기 위해 스트림이 만들어졌다. 스트림은 데이터소스를 추상화하고, 데이터를 다루는데 자주 사용되는 메서들을 정의해 놓았다.

특징

  • 스트림은 데이터 소스를 변경하지 않는다. 데이터 소스를 읽기만 하는 것이다. 필요하면 정렬된 결과를 컬렉션이나 배열에 담아 반환할 수는 있다.

  • 스트림은 일회용이다.

  • 스트림은 작업을 내부 반복으로 처리한다.


스트림의 연산

스트림이 제공하는 연산은 중간 연산과 최종 연산으로 분류할 수 있다. 중간 연산은 연산결과를 스트림으로 반환하기 때문에 연속해서 연결할 수 있다. 하지만 최종 연산은 스트림의 요소를 소모하면서 연산을 수행하므로 단 한번만 연산이 가능하다.

stream.distinct().limit(5).sorted().forEach(System.out::println)

중간 연산: distinct(), limit(5), sorted()
최종 연산: forEach(System.out::println)


Reference

Java의 정석 - 3rd Edition by. 남궁 성

profile
개발 공부 일지

0개의 댓글