람다식
메서드를 하나의 식으로 표현한 것, 함수를 간략하면서도 명확하게 표현할 수 있게 해준다.
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 |