[JAVA8신기능,Lambda 식]자바8 람다식(JAVA8,JDK1.8,Lambda __EXPRESSION__),함수형 인터페이스,오라클자바커뮤니티 자바기초교육,JAVA학원교육
- 파이썬에서 먼저 지원, 자바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 Consumer<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 }
(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
댓글 없음:
댓글 쓰기