[Java] 람다식

JAVA의 정석

람다식

람다식이란?

람다식은 ‘익명 함수’로 불리는데, 메서드에서 이름과 반환타입을 제거하기 때문이다.

int[] arr = new int[5];
Arrays.setAll(arr, ***(i)->(int)(Math.random()*5)+1***); //람다식으로 표현
int method(){
	return (int)(Math.random()*5)+1;
} 

람다식 작성하기

익명 함수답게 반환타입 X 이름 X

Java

Example. 두 값 중에서 큰 값을 반환하는 메서드 max를 람다식으로 변환

int max(int a, int b){
	return a > b ? a : b;
}
(int a, int b) -> {
	return a > b ? a : b;
}
  • 반환 값이 있는 메서드의 경우, return문 대신 ‘식’으로 대신 할 수 있다. 식의 연산결과가 자동으로 반환값이 된다. ‘문장’이 아닌 ‘식’이므로 끝에 ‘;’을 붙이지 않는다.
(int a, int b) -> { return a > b ? a : b;} // return문

(int a, int b) -> a > b ? a : b // 식으로 표현
  • 매개변수 타입 추론 가능한 경우 생략 가능. (대부분 생략가능)
(a, b) -> a > b ? a : b
  • 매개변수 하나뿐일 경우 괄호 생략 가능
a -> a * a         // OK
(int a) -> a * a   // OK : 매개변수 타입 있으면 괄호 생략 X
  • 괄호안의 문장이 하나일 경우 생략 가능. 문장 끝에 세미 콜론 X

함수형 인터페이스

List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");

Collections.sort(list, new Comparator<String>(){
	public int compare(String s1, String s2){
		retrun s2.compareTo(s1);
	}
});

이제 람다식으로 아래와 같이 간단히 처리 가능.

List<String> list = Arrays.asList("abc", "aaa", "bbb", "ddd", "aaa");
Collections.sort(list, (s1, s2) -> s2.compareTo(s1));

스트림(Stream)

스트림이란

문제점

  • 많은 수의 데이터를 다를 때, 컬렉션이나 배열에 데이터를 담고 원하는 결과를 얻기 위해 for문과 Iterator를 이용해서 코드 작성했음.
  • 데이터 소스마다 다른 방식으로 다뤄야하는 것. ex) List 정렬 → Collections.sort(), Arrays.sort()

해결을 위한 방법이 Stream

데이터 소스 추상화, 자주 사용되는 메서드 정의

⇒ 데이터 소스가 무엇이던 간에 같은 방식

⇒ 코드 재사용성 증가

스트림을 이용하면 배열, 컬렉션, 파일에 저장된 데이터 모두 같은 방식

String[] strArr = {"aaa", "ddd", "ccc"};
List<String> strList = Arrays.asList(strArr);

//스트림 생성
Stream<String> strStream1 = strList.stream();
Stream<String> strStream2 = Arrays.stream(strArr);

//정렬하고 출력하는 방법 동일. 하지만 데이터 소스가 정렬되는 것은 아님.
strStream1.sorted().forEach(System.out::println);
strStream2.sorted().forEach(System.out::println);

Tags:

Categories:

Updated:

Leave a comment