이번에는 람다와 스트림의 기본 개념에 대해 간략히 알아보겠습니다.
이미 가지고 있는 코드를 수정하는 방법을 다룰 것입니다!
이 기사에서 개념그리고 어떻게 사용된다른 성능 문제, 직렬화 등이 아니라 해야 할 일에만 집중하겠습니다. 아직 학습 단계에 있으므로 잘못된 정보가 있으면 알려주세요!
그럼 가!
람다와 스트림은 모두 Java 8에서 도입되었습니다.
그래서 Java 8부터는 이전 Java와 다르다는 점에서 현대 자바암튼 남들 못지않게 새로운 것도 있다고 합니다.

람다 식
내가 처음 람다와 스트림을 공부하기 시작했을 때 가장 적게 그린 부분은 람다 식이었습니다. -> 형태로 구성된 함수의 형태는 화살표 기능인가요? 그럭저럭 이해할 수 있었지만 :: 형태의 표현을 보고 현기증이 났다.
첫 번째 람다 식의 항등식한 번 보자
방법 람다 식으로 변환 보다!
정체성을 보려면 형태를 봐야 한다.
public int max(int a, int b) {
return a > b ? a : b;
}
이 방법을 살펴보겠습니다. 람다식으로 바꾸면…?
(int a, int b) -> {return a > b ? a : b;}
이 둘은 정확히 같은 일을 합니다. 또한 람다 식을 훨씬 더 줄일 수 있습니다!
(int a, int b) -> a > b ? a : b
(a, b) -> a > b ? a : b
이렇게 하면 매개변수의 종류와 반환값도 생략할 수 있다.
그렇다면 람다 식은 무엇입니까? 이름 없는 메서드…?
아니요! 람다 표현식은 이름이 없는 객체입니다!
람다 식 기능적 인터페이스 구현하나 이름 없는 개체
기능적 인터페이스는 추상 메서드가 있는 인터페이스입니다.
자바 8 함수 인터페이스
개요 기능적 인터페이스는 추상 메서드가 있는 인터페이스입니다. Java 8부터 인터페이스는 표준 구현과 함께 표준 메서드를 포함할 수 있습니다. 여러 당신
bcp0109.tistory.com
기능적 인터페이스를 구현하려면 추상 메서드만 구현이 시간에 할 수 있습니다 람다 식이 인터페이스를 구현하면 설계되지 않은 메서드는 람다 식과 정확히 1:1로 일치합니다.이렇게 하면 인터페이스를 구현하는 개체가 생성됩니다. 코드로 예를 들어 보겠습니다.
interface MaxFunction {
public abstract int max(int a, int b);
}
public class LambdaStudy {
public static void main(String() args) {
MaxFunction maxFunction = (a, b) -> a > b ? a : b;
System.out.println(maxFunction.max(1, 2)); // 2
}
}
maxFunction은 인터페이스였던 MaxFunction을 구현한 객체입니다. 이때 사용된 람다식은 인터페이스의 유일한 추상 메서드였던 것을 채우는 메서드가 된다. 따라서 개체에서 max()가 호출되면 람다 식의 내용이 호출됩니다.
음, 람다 식을 사용하려면 MaxFunction과 같은 유형을 앞에 붙여야 합니다. 그런 다음 기능적 인터페이스를 정의하고 앉아서 편안하게 한 줄을 작성해야 할까요…? 와, Evande, 아무도 그렇게 사용하지 않아
기본적으로 제공기능적 인터페이스(실행 가능, 공급업체, 소비자, 기능, 술어)
따라서 java.util.function 패키지에서 기본 기능 인터페이스를 제공합니다. 함수에 매개변수가 있느냐 없느냐, 반환값이 있느냐에 따라 다르며, 특정 매개변수와 반환형은 제네릭으로 제공되므로 무료다.
각 메서드 이름도 다음과 같이 다릅니다. B. run(), get(), accept(), apply(), test()가 있는데 IDE를 이용하면 외울 필요 없이 모두 알 수 있습니다.
| 기능 인터페이스 이름 | 방법 | 설명 |
| 실행 가능 | 잘못된 실행() | 매개변수 또는 반환 값 없음 |
| 공급자 |
나는 얻다 () | 매개변수 없음, 값만 반환 |
| 소비자 |
유효하지 않음(T t) 수락 | 매개변수만, 반환값 없음 |
| 기능 |
적용 R(Tt) | 매개 변수와 반환 값이 있는 일반 함수입니다. |
| 술부 |
부울 테스트(Tt) | 조건식에 사용되며 매개변수가 주어지면 부울 유형을 반환합니다. |
또한 매개 변수의 수에 따라 다른 함수 인터페이스가 있으므로 이 문서에서는 생략하겠습니다.
앞선 설명을 요약하면 다음 두 개는 같은 개체입니다.
public class LambdaStudy {
public static void main(String() args) {
Runnable r1 = () -> System.out.println("Hello World! 1");
Runnable r2 = new Runnable() {
@Override
public void run() {
System.out.println("Hello World! 2");
}
};
r1.run(); // Hello World! 1
r2.run(); // Hello World! 2
}
}
방법 참조
마지막으로 처음에 가장 문제가 많았던 ::를 해결할 때입니다.
너무 간단해서 부끄럽지만 람다 식을 메서드 참조로 직접 전환하는 방법에 대해 몇 가지 연습을 해볼 것입니다.
숫자 -> Integer.parseInt(Number) => Integer::parseInt
() -> 새 IllegalArgumentException 발생() => IllegalArgumentException::new