본문 바로가기
JAVA

JAVA_람다식(Rambda expression)

by haheaven 2021. 8. 10.

 

 

람다식 : jdk 1.8부터 추가

람다식 도입  : 자바 -> 객체지향언어 + "함수형 언어"

 

 

람다식

: 매서드를 하나의 식으로 표현

[* 객체를 기반으로 프로그램을 구현하고, 기능이 필요하면 클래스, 클래스 안 메서드 호출 해야하는 방식에서 함수의 호출만으로도 프로그램을 만들 수 있게 됨

-> 함수와 메서드는 입력과 출력이라는 점에서 비슷하나,

 함수는 일반적인 용어면서 클래스에 독립적이고, 메서드는 객체지향용어이면서 클래스에 종속적이다.!]

 

 

- 람다식의 구현 

//---> 일반 메서드
반환타입 메서드이름(매개변수) {
  문장~~;
   }
   
 //---> 람다식 
          (매개변수) -> { 문장~~~; }

ex)

int add(int x, int y) {
      return x + y;   }
     //  ------------> 람다식
       (int x, int y) -> { return x+y; }

① 반환값이 있는 메서드  : return, {}, ; 생략가능  ( return 있는 경우 {} 생락 불가)

(int x, int y) -> x + y

② 매개변수 타입이 추론 가능한 경우 생략 가능 : int, double 등 생략가능 

(x, y) -> x+y

③ 매개변수 하나일 경우 () 생략가능, 2개인 경우 생략 불가 

x -> x+x       // ok
int x -> x+x   //error
(int x) -> x+x //ok

 

 

- 함수형 인터페이스

: 람다식은 메서드 이름이 없고, 실행하는데 필요한 매개변수와 그 실행코드를 구현한 것임

자바에서는 참조변수를 통해 메서드를 호출하는데 람다식에는 메서드가 없음 ...

이를 구현하기 위해 함수형 인터페이스(메서드 오직 1개)를 만들고, 인터페이스에 람다식 구현할 메서드 선언!

//함수형 인터페이스 생성 	
 @FunctionalInterface
 interface lambda {
 	public void method(String s1, String s2);
	}
	
// 추상메서드 구현 
 class lambdachild implements lambda{
	@Override
	 public void method(String s1, String s2) {
		System.out.println(s1 + s2);
	 }
	}

 public class lambdatest {
	public static void main(String[] args) {
	     
	//람다테스트
	lambda c = (s,v) -> System.out.print(s + v);
	String s1 = "Hello ";
	String s2 = "World";
	c.method(s1, s2);
	}
}

 

 

- java.util.function 패키지

: 자주 쓰이는 형식의 메서드를 함수형 인터페이스로 미리 정의했기 때문에 이 패키지의 인터페이스 활용

- 예제(자바의 정석 Ex14_5)

class LambdaEx5 { 
	public static void main(String[] args) {
	Supplier<Integer> s = () -> (int)(Math.random()*100)+1; //s는 1~100난수
	Consumer<Integer> c = i -> System.out.print(i + ",");   //c는 i입력받기
	Predicate<Integer> p = i -> i%2==0;                     //p는 i받아 짝수일때 true
	Function<Integer, Integer> f = i -> i/10*10;            //f는 i받아 i/10*10 반환 
	List<Integer> list = new ArrayList<>();                 //list에 담기 
	makeRandomList(s, list);                    //makeRandomList s를 받아 list에 담기
	System.out.println(list);
	printEvenNum(p, c, list);                   //printEvenNum p에서 ture값 c에 입력되어 list 담기
	List<Integer> newlist = doSomething(f,list);      // doSomething i/10*10리턴해서 newlist에 담기
	System.out.println(newlist);
	
}
	static <T> List<T> doSomething(Function<T, T> f, List<T> list) {
		List<T> newlist = new ArrayList<T>(list.size());
		
		for(T i : list) {
			newlist.add(f.apply(i));     // 1의 자리 없애서 새 list담기
		}
		return newlist;
	}
	static <T> void printEvenNum(Predicate<T> p, Consumer<T> c, List<T> list) {
		System.out.print("[");
		for(T i : list) {               
			if(p.test(i))               //짝수검사
				c.accept(i);            //맞으면 i출력해서 list 담기
		}
		System.out.println("]");
		
	}
	static <T> void makeRandomList(Supplier<T> s, List<T> list) {
		for(int i=0; i<10; i++) {
			list.add(s.get());          // Supplier로부터 1~100 난수받아 list에 담기 
		}
	}
	}

 

 

 

 

 

참고 : 자바의 정석(남궁성)

'JAVA' 카테고리의 다른 글

JAVA_입출력  (0) 2021.11.04
JAVA_BufferedReader, StringTokenizer, BufferedWriter  (0) 2021.10.17
JAVA_Thread1  (0) 2021.08.08
JAVA_제네릭, 열거형, 애너테이션  (0) 2021.08.07
JAVA_컬렉션 프레임워크(Set, Map)  (0) 2021.08.06

댓글