람다

람다는 프로그래밍에서 사용되는 언어로 흔히들 익명함수를 나타내는 용어이다.

자바 8 이전의 버전에서는 추상메서드를 사용하기 위해 인터페이스를 상속받아 메서드를 구현하거나 익명클래스를 이용해 메서드를 구현해줘야 했다.

public class Main {
    public static void main(String[] args) {
        Cal add = new Cal() {
            @Override
            public int cal(int a, int b) {
                return a + b;
            }
        };

        System.out.println(add.cal(1, 2));
    }
}

interface Cal {
    int cal(int a, int b);
}

위에 이러한 코드가 자바 8에서 람다가 나오며 훨씬 간편해진다. 여기서 람다란 메소드 표현식을, 메서드 타입, 메서드 이름, 매개변수 타입, 중괄호, return 문을 생략하고, 화살표 기호를 넣은 것이다.

int add(int a, int b){
	return a + b;
}

이게

(a, b) -> a + b 이렇게 된다.

이런 방식으로 위의 코드를 줄이면

public class Main {
    public static void main(String[] args) {
        Cal add = (int a, int b) -> a + b;
        System.out.println(add.cal(1,2));
    }
}

interface Cal{
    int cal(int a, int b);
}

이렇게 바꾸어 코드의 가독성과 개발시간을 줄일 수 있게 된다.

스트림

스트림이란 기존 자바에서 데이터를 저장하기 위해 배열이나, 컬렉션 프레임워크를 이용해왔는데 저기에 저장된 데이터들에 접근하기 위해선 반복문이나 iterator를 사용해야하기 때문에 매번 번거롭게 코드를 작성해야했다.

이러한 문제점들을 극복하기 위해 나온 것이 스트림이다.

스트림의 특징은 크게 3가지인데

  1. 데이터를 변경하지 않는다.
    1. 기존의 컬렉션이나 배열로부터 값을 읽기만 할뿐 변경하지 앟는다.
  2. 한번만 쓸 수 있다.
    1. iterator처럼 컬렉션의 값들을 읽고나서 다시 사용하지 못한다.
  3. 내부 반복이다
    1. 스트림 내부에는 내부 반복 코드가 람다로 숨겨져있어 우리눈엔 코드가 간결하다.
import java.util.*;

public class Main {
    public static void main(String[] args) {
        List<Integer> num = Arrays.asList(1, 2, 3, 4, 5, 6);

        num.stream()
                .filter(n -> n % 2 == 0)
                .forEach(System.out::println);
    }
}