-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[모던 자바 인 액션] 2주차 #4
Comments
2주차 람다 표현식 💡 람다 표현식과 함수형 인터페이스를 살펴본다 상황에 맞는 함수형 인터페이스를 떠올릴 수 있도록 한다람다 표현식람다란? 메서드로 전달할 수 있는 익명 함수를 단순화한 것 람다 표현식에는 이름은 없지만, 파라미터 리스트, 바디, 반환 형식, 발생할 수 있는 예외 리스트는 가질 수 있다. // 람다 표현식 예시
(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());
람다 파라미터 화살표 람다 바디 람다는 함수형 인터페이스를 기대하는 곳에서 사용할 수 있다. 함수형 인터페이스의 추상 메서드 시그니쳐 == 함수 디스크립터 자주 사용하는 함수는 아래와 같다.
Predicate // T → boolean추상 메서드 test 정의 제네릭 형식 T의 객체를 인수로 받아 불리언 반환 @FunctionalInterface
public interface Predicate<T> {
/**
* Evaluates this predicate on the given argument.
*
* @param t the input argument
* @return {@code true} if the input argument matches the predicate,
* otherwise {@code false}
*/
boolean test(T t);
} Function<T, R> // T → void추상메서드 apply 정의 제네릭 형식 T를 인수로 받아서 제네릭 형식 R 객체를 반환 @FunctionalInterface
public interface Function<T, R> {
/**
* Applies this function to the given argument.
*
* @param t the function argument
* @return the function result
*/
R apply(T t);
}
// example
Function<Integer, Integer> square = x -> x * x;
int result = square.apply(2); // 4 Consumer // () → T추상 메서드 accept 정의 제네릭 형식 T 객체를 받아서 void 를 반환 @FunctionalInterface
public interface Consumer<T> {
/**
* Performs this operation on the given argument.
*
* @param t the input argument
*/
void accept(T t); Supplier // () → R추상 메서드 get 정의 인수를 받지않고 제네릭 형식 T를 반환 @FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
} UnaryOperator // T → T제네릭 형식 T 객체를 받아서 T를 반환 @FunctionalInterface
public interface UnaryOperator<T> extends Function<T, T> {
/**
* Returns a unary operator that always returns its input argument.
*
* @param <T> the type of the input and output of the operator
* @return a unary operator that always returns its input argument
*/
static <T> UnaryOperator<T> identity() {
return t -> t;
}
// example
UnaryOperator<String> CREATE_USER_KEY = userId -> "prefix" + userId + "_" + LocalDateTime.now().toString();
String userId = "myId";
String userKey = CREATE_USER_KEY.apply(userId); // prefix_myId_2023xxxx
UnaryOperator<String> == Function<String, String>
람다 표현식의 조합람다 표현식은 조합이 가능하다.
|
스트림 vs 컬렉션컬렉션이란컬렉션은 현재 자료구조가 포함하는 모든 값을 메모리에 저장하는 자료구조이다. 스트림이란스트림(Stream)은 자바 8 API에 새로 추가된 기능으로써 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소(Sequence of elements)로 정의할 수 있다. 스트림(Stream)의 특징
그래서 둘 차이는 뭔데?
컬렉션 = DVD DVD는 영상 전체 데이터를 CD에 모두 담고 있는 것처럼 컬렉션은 현재 자료구조가 포함하는 모든 값을 메모리에 저장한다. 즉, 컬렉션의 모든 요소는 컬렉션에 추가하기 전에 계산되어야 한다. 스트림 = 인터넷 스트리밍 스트림은 사용자가 필요로 하는 몇 부분만 미리 내려받는 스트리밍 서비스와 비슷하다. 스트림은 이론적으로 요청할 때만 요소를 계산하는 고정된 자료구조이다. 사용자가 요청하는 값만 추출하는 것이 스트림의 핵심이다.
컬렉션과 스트림은 데이터 반복 처리 방법에서 차이가 있다. 컬렉션은 외부 반복을 사용한다. 외부 반복이란 사용자가 for-each 등을 사용해서 직접 요소를 반복하는 것을 말한다. 스트림은 내부 반복을 사용한다. 외부 반복
내부 반복
반복자와 마찬가지로 스트림도 단 한번만 탐색할 수 있다. 탐색된 스트림의 요소는 소비된다. 반복자와 마찬가지로 한번 탐색한 요소를 다시 탐색하려면 초기 데이터 소스에서 새로운 스트림을 만들어야한다.
위 코드에서 보듯이, 스트림은 단 한번만 소비할 수 있다. |
스터디 날짜
2023.07.07 9-10
내용
챕터3. 람다 표현식
챕터4. 스트림 소개
공유
최승위
이성온
정민교
The text was updated successfully, but these errors were encountered: