[자바]람다와 스트림

allnight5·2022년 12월 15일
0

자바 개념정리

목록 보기
25/28

람다식(Lambda expression) 메서드를 하나의 식으로 표현한 것이다.
그러나 메서드를 람다식으로 표현하면 메서드 이름과 반환값이 없어지므로, 람다식을 익명 함수 라고도한다.

int[] arr = new int[5];
Arrays.setAll(arr, (i) -> (int)(Math.random()*5)+1);
아래내용을 위로 바꾼것이 람다식이다.

int method(int i){
	return (int)(Math.random()*5)+1;
}

람다식으로 인해 메서드를 변수처럼 다루는 것이 가능해진것이다.
메서드를 람다식으로 작성하는 과정이다.
1.

int max(int a, int b){
return a>b ? a : b;
}

int max(int a, int b) - >{
return a>b? a:b;
}

반환 값이 있는 메서드의 경우 return문 대신에 식(expression)으로 대신할수있다. 식의 연산 결과가 자동적으로 반환된다 이때는 문장(statement)이 아닌 식이므로 끝에 ';'(콜론)을 붙이지 않는다.

  1. (int a, int b) -> {return a>b? a: b;} -----> (int a, int b) -> a>b ? a:b

  2. 완성
    (int a, int b) -> a>b? a:b ----------> (a, b) -> a> b? a:b

매개 변수가 하나 뿐이라면 괄호를 생각할수있다. 단 매개변수의 타입이 있으면 (int a) 괄호()를 생략할수없다.

(a) -> a*a ------------> a -> a*a

여기까지 해서 안것은 메서드 조건문이 있을때 어떠한 방식으로 람다식으로 변환되는지 알수있었고 콜론을 붙이면 안된다는 것도 알았다. 하지만 만약 괄호 안에 문장이 return문일 경우 괄호{} 생략을 할수없다.반복문은 어떻게 할것인가?


매개 변수가 하나인 함수형 인터페이스

함수형 인터페이스메서드설 명
java.lang.Runnalbevoid run()매개변수도 없고, 반환값도 없음.
SupplierT get()매개 변수는 없고, 반환값만 있음
Consumervoid accept(T t)supplier와 반대로 매개변수가 밌고 반환값이 없음
Function<T,R>R aplly(T t)일반적인 함수 하나의 매개변수를 받아서 결과를 반환
Predicateboolean test(T t)조건식을 표현하는데 사용됨. 매개변수는 하나 반환 타입은 boolean

매개 변수가 두개인 함수형 인터페이스

함수형 인터페이스메서드설 명
BiConsumer<T, U>void accept(T t, U u)두개의 매개변수만 있고 반환값이 없다.
BiPredicate<T,U>boolean test(T t, U u)조건식을 표현하는데 사용되며 매개변수는 둘 반환값은 boolean
BiFunction<T,U,R>R aplly(T t, U u)두개의 매개변수를 받아서 하나의 결과를 반환

함수형 인터페이스메서드설 명
UnaryOpertatorT apply(T t)Function의 자손, Function과 달리 매개변수와 결과의 타입이 같다.
BinaryOperatorT test(T t, T t)BiFunction의 자손, BiFuntion과 달리 매개변수와 결과의 타입이 같다.

메서드 참조


  Integer wapper(String s){
  	return Integet,parseInt(s);
  }

위 메서드를 아래와 같이 바꿀수 있다.
Fucntion<String, Integer> f = (string s) -> Integer.parseInt(s);
↓ ↓ ↓ ↓
Fucntion<String, Integer> f = Integer::parseInt;//메서드 참조

하나의 메서드만 호출하는 람다식은


클래스이름::메서드이름 또는 참조변수::메서드 이름으로 바꿀수있다.


스트림


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

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

strStream1.sorted().forEach(System.out::println);
strStream2.sorted().forEach(System.out::println);

스트림은 1회용으로 한번 사용하고 나면 새롭게 스트림을 생성해줘야한다 중요하다.

profile
공부기록하기

0개의 댓글