식
으로 표현한 것익명 함수
(이름이 없는 함수)객체
이며 더 정확히는 익명 클래스
이다.💡 코드를 간결하면서 명확하게 표현할 수 있다는 장점을 가지고 있다.
//기존 메서드 표현 방식
void sayhello() {
System.out.println("HELLO!")
}
//위의 코드를 람다식으로 표현한 식
() -> System.out.println("HELLO!")
int sum (int x, int y) {
return x + y ;
}
==람다식으로 변환=>
(x, y) -> x + y
매개변수의 타입
역시 유추가 충분히 가능한 상황이라면 생략이 가능하다.소괄호()
도 생략이 가능하다.리턴문
과 세미콜론
생략 가능중괄호({})
생략이 가능하나, 두개 이상일 때에는 생략이 불가능하다.익명 클래스
이다.💡
익명 클래스
: 객체의 선언과 생성을 동시에 하며 오직 하나의 객체를 생성하고 단 한번만 사용되어지는 일회용 클래스
Object
클래스를 상속 받고 있지만 익명 클래스 내에 있는 메서드가 Object
클래스에 존재하지 않기 때문에 익명 클래스에서 람다식으로 구현한 메서드를 사용할 수 없다.함수형 인터페이스
를 사용한다.익명 객체
라고 볼 수 있다.💡 주의 사항
함수형 인터페이스는 단 하나의 추상 메서드만 선언될 수 있다.
-> 람다식과 인터페이스의 메서드가 1:1로 매칭되어야 하기 때문에!
public interface MyFunctionalInterface {
public void accept(매개변수);
}
// 익명객체 선언과 동시에 생성
MyFunctionalInterface example = (매개변수) -> {실행할 코드};
// 메서드 초훌
example.accept(매개변수 대입값);
자바에서는 빈벅하게 사용되는 함수형 인터페이스를 기본적으로 제공하고 있다.
https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
람다식에서 불필요한 매개변수를 제거할 때 사용된다.
즉, 람다식을 더욱 간단하게 사용하고 싶을 때 사용.
클래스명 :: 메서드명
//예시 Math클래스의 max()메서드를 참조할 때
Math::max;
클래스명::메서드명
참조변수명::메서드명
클래스명::new
: 배열, 컬렉션
의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자
어떻게
수행하는지 보다는 무엇을
수행하는 지에 관심을 두는 프로그래밍 int sum =
numbers.stream()
.filter(number -> number > 4 && (number % 2 == 0))
.mapToInt(number -> number)
.sum();
💡
외부 반복자 : 요소를 가져 오는 것부터 처리하는 것까지 개발자가 작성
내부 반복자 : 요소 처리 내용만 개발자가 전달하고 반복은 컬렉션 내부에서 자동으로 처리
💡 주의 사항
스트림은 데이터 소스로부터 데이터를 읽기만 할 뿐 변경하지 않는다.
스트림은 일회용이므로 한번 사용하면 닫힌다! 필요하다면 새로운 스트림을 만들어야 함.
리덕션 : 대량의 데이터를 가공해서 축소하는 것
리덕션의 대표 결과물 : 데이터의 합계, 평균값, 최대값 등
파이프라인
으로 해결스트림 : 데이터를 연속적으로 전달하는 통로
// 1. 컬렉션의 스트림 생성
// : Collection 인터페이스에는 stream()가 정의되어 있음
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> listStream = list.stream(); // 스트림 생성 완료!
// 2. 배열의 스트림 생성
// : Stream의 of()메서드나 Arrays의 stream()메서드를 사용
Stream<String> stream = Stream.of(new String[] {"a", "b", "c"});
Stream<String> stream = Arrays.stream(new String[] {"a", "b", "c"});
IntStream
을 사용하는 것을 권장: 연산 결과를 스트림으로 반환하기 때문에 연속해서 여러번 수행할 수 있다.
map() | flatMap() | |
---|---|---|
반환타입 | 스트림의 스트림 | 스트림 |
Stream<Stream> | Stream |
: 연산 결과가 스트림이 아니므로 한번만 연산이 가능
: optional은 null값으로 인해 에러(NullPointerException)가 발생하는 현상을 객체 차원에서 효율적으로 방지하고자 도입되었다.
💡 Optional 객체는 스트림과 유사하게 여러 메서드를 연결해서 작성할 수 있다.