티스토리 뷰

반응형

| 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
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday