티스토리 뷰
반응형
| Lambda Expressions
Lambda Expression 을 사용하면 단일 메서드 클래스의 인스턴스를 보다 간결하게 표현할 수 있다.
// 단일 매개 변수
parameter -> expression
// 둘 이상의 매개 변수
(parameter1, parameter2) -> expression
// 반환 사용
(parameter1, parameter2) -> { code }
| Lambda Expressions 이상적인 사용 사례
> Person Class
public class Person {
public enum Sex {
MALE, FEMALE
}
String name;
LocalDate birthday;
Sex gender;
String emailAddress;
public int getAge() {
// ...
}
public void printPerson() {
// ...
}
}
|| 익명 클래스에서 검색
interface CheckPerson {
boolean test(Person p);
}
printPersons(
roster,
new CheckPerson() {
public boolean test(Person p) {
return p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25;
}
}
);
익명 클래스 구문에서 CheckPersion Interface에 메서드가 하나만 포함되어 있다는 점을 보면 부피가 크다.
이러한 경우 익명 클래스 대신 람다 식을 사용할 수 있다.
|| Lambda Expression 을 사용하여 검색
printPersons(
roster, (Person p) -> p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25
);
functional interface 에 추상 메서드가 하나만 포함되어 있으므로 구현 시 해당 메서드 이름을 생략할 수 있다.
익명 클래스 식을 사용하는 대신 메서드 호출에서 람다 식을 사용
printPersonsWithPredicate(
roster,
p -> p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25
);
processPersons(
roster,
p -> p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25,
p -> p.printPerson()
);
processPersonsWithFunction(
roster,
p -> p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25,
p -> p.getEmailAddress(),
email -> System.out.println(email)
);
|| Lambda Expression 을 매개 변수로 혀용하는 집계 작업
집합 연산을 사용하는 경우
-
집합 작업은 컬렉션에서 직접 가져오지 않고 Stream에서 요소를 처리
processElements(
roster
.stream()
.filter(
p -> p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25)
.map(p -> p.getEmailAddress())
.forEach(email -> System.out.println(email)
);
개체의 소스 얻기 | Stream<E> stream() |
개체와 일치하는 Predicate 개체 필터링 | Stream<T> filter(Predicate<? super T> predicate) |
함수 객체에 의해 지정된 다른 값에 객체를 매핑 | <R> Stream<R> map(Function<? super T,? extends R> mapper) |
Consumer 개체에서 지정한 작업 수행 | void forEach(Consumer<? super T> action) |
| Lambda Expressions 구문
> 쉼표로 구분된 형식 매개 변수 리스트
p -> p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25
> return이 필요한 경우 중괄호 사용
p -> {
return p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25;
}
> 둘 이상의 매개변수를 사용할 경우 예시
public class Calculator {
interface IntegerMath {
int operation(int a, int b);
}
public int operateBinary(int a, int b, IntegerMath op) {
return op.operation(a, b);
}
public static void main(String... args) {
Calculator myApp = new Calculator();
IntegerMath addition = (a, b) -> a + b;
IntegerMath subtraction = (a, b) -> a - b;
System.out.println("40 + 2 = " + myApp.operateBinary(40, 2, addition));
System.out.println("20 - 10 = " + myApp.operateBinary(20, 10, subtraction));
}
}
| Lambda Expressions Example
> forEach()
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<Integer>();
numbers.add(5);
numbers.add(9);
numbers.add(8);
numbers.add(1);
numbers.forEach( (n) -> { System.out.println(n); } );
}
}
> consumer Interface 를 사용하여 람다 식을 변수에 저장
import java.util.ArrayList;
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<Integer>();
numbers.add(5);
numbers.add(9);
numbers.add(8);
numbers.add(1);
Consumer<Integer> method = (n) -> { System.out.println(n); };
numbers.forEach( method );
}
}
> 람다 식을 매개변수로 사용하는 메서드
interface StringFunction {
String run(String str);
}
public class Main {
public static void main(String[] args) {
StringFunction exclaim = (s) -> s + "!";
StringFunction ask = (s) -> s + "?";
printFormatted("Hello", exclaim);
printFormatted("Hello", ask);
}
public static void printFormatted(String str, StringFunction format) {
String result = format.run(str);
System.out.println(result);
}
}
Reference : docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
www.w3schools.com/java/java_lambda.asp
Image : www.callicoder.com/java-lambda-expression-tutorial/
반응형
'Web > JAVA' 카테고리의 다른 글
[JAVA] MultiThreading, 멀티스레드 (0) | 2021.10.15 |
---|---|
[JavaMail API] JAVA SMTP 메일 발송하기 (0) | 2021.06.18 |
[JAVA] 자주 사용하는 코드 Templates 만들기(Ctrl + Space) (0) | 2020.10.21 |
[JAVA] 기술 정리 (2) | 2019.08.28 |
[JAVA] HashSet (0) | 2019.08.14 |
댓글