2014년 7월 30일 수요일

자바8 람다식(JAVA8,JDK1.8,Lambda __EXPRESSION__),함수형 인터페이스

자바8 람다식(JAVA8,JDK1.8,Lambda __EXPRESSION__),함수형 인터페이스

- 파이썬에서 먼저 지원, 자바8 업데이트에서 제공된 기능으로
- 기존의 반복이나 비교문들의 가독성을 대폭적으로 향상
- 람다식은 익명 함수에서 주로 사용한다.
- 프로그래밍에서 식별자 없이 실행할 수 있는 방법을 제공
- java.util.function 패키지에는 몇가지 미리정의된 함수형 인터페이스가 있다.
(http://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html)

Predicate: 하나의 매개변수를 주고 boolean형을 반환하는 인터페이스를 구현해줄 수 있다.

public interface Predicate<T> {
boolean test(T t);
}

Consumer: 하나의 매개변수를 주고 void 인터페이스를 구현

public interface Predicate<T> {
void accept(T t);
}

Function: Transform a T to a U

public interface Function<T, R> {
R apply(T t);
}

Supplier: Provide an instance of a T (such as a factory)

public interface Supplier<T, U, R> {
R apply(T t, U u);
}

UnaryOperator: A unary operator from T -> T
BinaryOperator: A binary operator from (T, T) -> T



- 형식
(arg1, arg2...) -> { body }   //body에 표현식이 없거나 한개이상 올 수 있다.

(params) -> __EXPRESSION__
(params) -> statement
(params) -> { statements }

Read more: http://javarevisited.blogspot.com/2014/02/10-example-of-lambda-__EXPRESSION__s-in-java8.html#ixzz38wH6AF2H

(int a, int b) -> {  return a + b; } 
() -> System.out.println("Hello World");    //파라미터없고 Hello World출력
(String s) -> { System.out.println(s); }    //문자열을 입력받아 출력
() -> 8514790            //파라미터없고 8514790가 리턴
() -> { return 3.14 };   //파라미터없고 3.14리턴




[예제]

package onj;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.*;

class Developer {
private String skill;
private int carri;
public Developer(String skill, int carri) {
this.skill = skill;
this.carri = carri;
}
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
public int getCarri() {
return new Integer(carri);
}
public void setCarri(int carri) {
this.carri = carri;
}
@Override
public String toString() {
return getSkill() + "::" + getCarri();
}
}

public class LambdaTest {
public static void printAll(List<Developer> list) {
//아래와 동일
//list.forEach((x) -> System.out::println(x))
list.forEach(System.out::println);
}
public static void printDevOrderBySkill(List<Developer> list) {
Collections.sort(list, (
      Developer d1, Developer d2) -> d1.getSkill().compareTo(d2.getSkill()));
list.forEach(System.out::println);
}
public static int sumAll(List<Integer> numbers, Predicate<Integer> p) {
int total = 0;
for(int number : numbers) {
if (p.test(number)) {
total += number;
}
}
return total;
}
public static void main(String[] args) {
//쓰레드 생성, 예전방법
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("oraclejava community thread1....");
}
}).start();
//쓰레드 생성, 람다식이용
new Thread( () -> System.out.println("oraclejava community thread2....")).start();
List<Developer> dev = new ArrayList();
dev.add(new Developer("JAVA", 10));
dev.add(new Developer("ORACLE", 15));
dev.add(new Developer("C#", 7));
dev.add(new Developer("ANDROID", 5));
printAll(dev);
System.out.println("---------------------------");
printDevOrderBySkill(dev);
System.out.println("---------------------------");
List<Integer> list = Arrays.asList(1,8,3,9,4,7);
int sum1 =  sumAll(list, n -> true);       //전부다 합
int sum2 = sumAll(list, n -> n % 2 == 0);  //짝수 합
int sum3 = sumAll(list, n -> n  > 5);      //5보다큰수 합
//전부 출력
list.forEach(System.out::println);
System.out.println("모든 수 합 : " + sum1);
System.out.println("짝수 합 : " + sum2);
System.out.println("5보다큰수합 : " + sum3);

}
}




[결과]

oraclejava community thread1....
oraclejava community thread2....
JAVA::10
ORACLE::15
C#::7
ANDROID::5
---------------------------
ANDROID::5
C#::7
JAVA::10
ORACLE::15
---------------------------
1
8
3
9
4
7
모든 수 합 : 32
짝수 합 : 12
5보다큰수합 : 24

댓글 없음:

댓글 쓰기