람다식

성혜·2024년 1월 22일
0

Java

목록 보기
22/25
post-thumbnail

람다식, Lambda Expression

함수형 프로그래밍 방식을 지원하는 표현식

람다식을 사용하면 코드가 간결해진다.(호불호)

자바 > 컬렉션(배열) 조작을 위해서 제공


  • 람다식은 매개변수를 가지는 코드블럭이다.
  • 자바의 람다식은 인터페이스를 사용해서 만든다.
  • 자바의 람다식은 익명 객체를 만드는 표현을 간소화시킨 기술이다.

람다식 형식

//인터페이스 변수 = 람다식;
MyInterface m1 = () -> {};

(매개변수) -> {구현부};
a. (매개변수) : 추상 메서드의 인자리스트
b. -> 화살표(Arrow), 구현부 호출하는 역할(연결)
c. {구현부} : 추상 메서드의 구현부
  • 예시코드
    : 인터페이스 구현이 메인 함수 밑에 있지만 보기 편하게 위로 올렸습니당.
@FunctionalInterface
//람다식을 저장할 수 있는 인터페이스라는 뜻
interface MyInterface {
	void test();
}

class MyClass implements MyInterface{

	@Override
	public void test() {
		System.out.println("실명 클래스에서 구현한 메서드");
		
	}
	
}


//요구사항] MyInterface를 구현한 객체를 생성하시오.
		
		//Case 1. 클래스 선언 + 객체 생성
		MyInterface m1 = new MyClass();
		m1.test();
		
		//Case 2. 익명 객체 생성
		MyInterface m2 = new MyInterface() {
			@Override
			public void test() {
				System.out.println("실명 클래스에서 구현한 메서드");
			}
		};
		m2.test();
		
		
		//Case 3. 람다식
		MyInterface m3 = () -> {
			System.out.println("람다식으로 구현한 메서드");
		}; //() = test이지만 생략됨
		
		m3.test();

  • 추가 구현 코드
interface MultiParameterNoReturn {
	void call(String name, int age);
}

interface ParameterReturn{
	int call(int a, int b);
}


//main 함수 안
		MultiParameterNoReturn pr8 =(String name, int age) -> {
			System.out.println(name + "," + age);
		};
		pr8.call("홍길동", 20);
		
		MultiParameterNoReturn pr9 =(name, age) -> {
			System.out.println(name + "," + age);
		};
		pr9.call("홍길동", 30);
		
		//*** 매개변수의 ()는 매개변수가 1일 때만 생략이 가능하다.
//		MultiParameterNoReturn pr10 =name, age -> {
//			System.out.println(name + "," + age);
//		};
//		pr10.call("홍길동", 40);

		MultiParameterNoReturn pr11 =(name, age) -> System.out.println(name + "," + age);
		pr9.call("홍길동", 50);
        
        //*** 구현부에 return문이 유일하면 {}와 return을 생략할 수 있다.
        ParameterReturn pr14 = (int a, int b) -> {
			return a + b;
		};
		System.out.println(pr14.call(10, 20));
		
		ParameterReturn pr15 = (a, b) -> a + b;
		System.out.println(pr14.call(200, 20));





람다식의 가장 큰 장점 > 간단함(생산성)
람다식의 가장 큰 단점 > 인터페이스를 선언해야한다.

따라서!🙏
자바에서는 여러가지 형식의 람다식(추상메서드)를 저장할 수 있는 인터페이스를 미리 제공

함수형 인터페이스 (Functional Interface)

  • 평범한 인터페이스
  • 목적 > 람다식을 저장한다.
  1. 표준 API 함수형 인터페이스 > JDK 제공
  2. 사용자 정의 함수형 인터페이스 > 개발자 선언 => 지금까지 위에서 한 것!

표준 API 함수형 인터페이스

1. Consumer

  • Consumer
  • Bicosumer<T,U>
  • ..
  • 매개변수 O , 반환값 X => 추상 메서드를 제공한다.
    		 //Consumer
    		//- 매개변수를 받아서 소비하는 업무를 구현하는 인터페이스
    		//- acceptXXX() 추상 메서드 제공
    
    		//java.util.function 패키지
    		Consumer<Integer> c1 = num -> System.out.println(num);
    		c1.accept(100);
    		Consumer<Integer> c2 = num -> System.out.println(num * num);
    		c2.accept(100);
    

2. Supplier

  • Supplier

  • 매개변수 X , 반환값 O => 추상 메서드를 제공한다.

    			//Supplier
    			//매개 변수 없이 반환값을 돌려주는 업무를 구현하는 인터페이스
    			//- getXXX() 추상 메서드 제공
    			//반환타입 써주는 것
    			Supplier<Integer> s1 = ( )-> {return 10;};
    			System.out.println(s1.get());
    			Supplier<Double> s2 = ( )-> Math.random();
    			System.out.println(s2.get());

3. Function

  • Function<T,R>
  • BiFunction<T,R>
  • 매개변수 O , 반환값 O => 추상메서드 제공
    			//Function
    			//- 매개변수를 전달하면 처리 후 반환 값을 돌려주는 업무를 구현하는 인터페이스
    			//- applyXXX() 추상 메서드 제공 
    		
    			Function<Integer, Boolean> f1 = num -> num > 0;
    			System.out.println(f1.apply(10));
    			System.out.println(f1.apply(-10));
    		
    			Function<String, Integer> f2 = str -> str.length();
    			System.out.println(f2.apply("홍길동입니다."));
    		
    			//앞에 두개는 매개변수, 마지막 리턴
    			BiFunction<Integer,Integer,String> bf1 = (a,b) -> {
    				if(a>b) {
    					return "크다";
    				}else if( a<b) {
    					return "작다";
    				}else {
    					return "같다";
    				}
    			};
    			System.out.println(bf1.apply(20,10));
                             
    	  	

4. Operator

  • Function 하위셋

  • 매개변수를 연산 후 반환하는 행동

  • UnaryOperator

  • BinaryOperator

  • 매개변수 O , 반환값 O => 추상메서드 제공

    			//Operator
    			//- 매개변수를 전달하면 처리 후 반환 값을 돌려주는 업무를 구현하는 인터페이스
    			//- applyXXX() 추상 메서드 제공 
    			//- 추상 메서드의 매개변수의 반환값이 자료형이 동일하다.
    
    			BiFunction<Integer,Integer,Integer> bf1 = (a,b) -> a + b;
    			System.out.println(bf1.apply(10, 20));
    		
    			//매개변수 2개 => 매개변수 무조건 integer, 반환값도 integer => 위에랑 똑같음
    			//함수의 하위셋
    			BinaryOperator<Integer> bo1 = (a,b) -> a + b;
    			System.out.println(bf1.apply(10, 20));
    		
    			//매개변수 1개
    			UnaryOperator<Integer> uo1 = a -> a*a;
    			System.out.println(uo1.apply(2));
    
    
    
    	  

5. Predicate

  • Function 하위셋

  • 매개변수를 연산 후 반환하는 행동

  • Predicate

  • BiPredicate <T,U>

  • 매개변수 O , 반환값 O => 추상메서드 제공

    			//Predicate
    			//- 매개변수를 전달하면 처리 후 반환 값을 돌려주는 업무를 구현하는 인터페이스
    			//- testXXX() 추상 메서드 제공
    			//- 논리 검사 > Boolean 반환
    		
    			Function<Integer, Boolean> f1 = num -> num >0;
    			System.out.println(f1.apply(10));
    			System.out.println(f1.apply(-10));
    		
    			//반환값이 무조건 boolean
    			Predicate<Integer> p1 = num -> num >0;
    			System.out.println(f1.apply(10));
    			System.out.println(f1.apply(-10));
    
profile
하루를 정리하고 기록합니다.

0개의 댓글