자바 스터디_15주차 과제 람다식

이경환·2023년 1월 28일
0

JAVA

목록 보기
5/6
  • 자바의 함수형 프로그래밍 이란
    객체지향의 대표적인 언어인 자바 비동기 논블로킹의 기능 도입하기 위해 Optional람다식 을 도입했다.
    참고: https://tecoble.techcourse.co.kr/post/2021-09-30-java8-functional-programming/ (자바의 함수형 프로그래밍은 어떻게, 왜 도입 되었을까.)
    • 동기vs비동기 : 순서의 관점,결과 처리 관점
      • 동기 :순차적으로 실행되며 작업이 수행 중이면 다음 작업은 대기중에 놓인다.
      • 비동기 : java의 멀티스레드 환경에서의 처리가 대표적인 비동기식 처리 방식 직렬적인 작업이 아닌 병렬적 처리방식 동기와 다르게 처리 중인 작업(테스크) 가 끝나지 않더라도 다음 작업을 실행한다.
      • 블로킹vs논블로킹
        제어의 관점
        참고자료 :https://www.youtube.com/watch?v=oEIoqGdSns
  • 람다
    - 람다식 사용법
    - 람다식은 익명객체다 (자바에서는 함수는 클래스에 종속되기 떄문에) 익명객체란 이름 없는 객체,클래스 라고도한다. 재사용성 없는 일시적으로만 사용되는 이 객체는 예전에 학습했던 자바swing 이벤트처리,스레드 Ruannable 등을 할때 사용한다. 다시 말하자면 람다식은 이 익명객체를 간단히 표현 하는 방법이다. 밑과 같은 로직에서 int max라는 메서드를 표현하려 하는것이다.
          ```java
            public class LamdaEx_1 {
                public static void main(String[] args) {
            
                    new Object() {
                        int max(int a, int b) {
                            return a > b ? a : b;
                        }
                    };
            			//		int value = object.max(3,5); 사용불가
                }
            }
         ```
            
      - 함수형 인터페이스
        
        하나의 추상 메서드만 선언된 인터페이스.  람다식을 다루려면 위와같은  Object 타입으로는 max 를 사용할 수 없다 object 에는 max라는 메서드가없다.  그렇기 때문에 자바는 참조형 변수를 통해 객체를 사용한다 → 참조형 변수의 타입을 만들어 줘야 한다 → 함수형 인터페이스를 사용해 람다식을 사용한다.
        
        <기본형 함수형 인터페이스>
        
        | java.lang.Runnalbe | void run() | 매개변수, 반환 모두 없음 |
        | --- | --- | --- |
        | Supplier<T> | T get() | 매개변수 없음, 반환 T |
        | Comsumer<T> | void accept(T t) | 매개변수 T, 반환 없음 |
        | Function<T, R> | R apply(T t) | 매개변수 T, 반환 R |
        | Predicate<T> | boolean test(T t) | 매개변수 T, 반환 boolean |
        |  |  |  |
        |  |  |  |
        
        ```java
        
        package JavaJungSuk3_Study.Example.java8;
        
        import java.util.*;
        
        public class CollectionLamda {
            public static void main(String[] args) {
                List<Integer> list = new ArrayList<>();
                for (int i = 0; i < 10; i++) {
                    list.add(i);
                }
        
                list.forEach(i -> System.out.print(i + ",")); //consumer
                System.out.println();
        
                //람다로하면 코드의 양을 매우 줄일수 있다.
        //        Iterator it = list.listIterator();
        //        while (it.hasNext()) {
        //            System.out.println(it.next());
        //        }
        
                list.removeIf(x -> x % 2 == 0 || x % 3 == 0);
                System.out.println(list);
        
                list.replaceAll(i -> i * 10);
                System.out.println(list);
        
                Map<String, String> map = new HashMap<>();
                map.put("1", "1");
                map.put("2", "2");
                map.put("3", "3");
                map.put("4", "4");
        
                map.forEach((k, v) -> System.out.print("{" + k + "," + v + "},"));
                System.out.println();
            }
        }
        ```
        
        위와같이 컬렉션프레임워크도 코드의 양을 매우 줄일수있다 기존의 이터레이터를 쓰지않고
        
     - Variable Capture
    - 메소드, 생성자 레퍼런스
    람다식을 더 간단히 만든것이 메서드 레퍼런스다.
    클래스::메서드 의 형태를 가진다
    public class MethodRefenrce {
      public static void main(String[] args) {
          Function<String, Integer> f = (String s) -> Integer.parseInt(s);
          Function<String, Integer> f1 = Integer::parseInt;
      }
    }
profile
개선하는 개발자, 이경환입니다

0개의 댓글