Lambda 표현식을 철저히 깨닫다

20177 단어 JavaSElambda

1.1 Lambda 표현식


1.1.1 함수식 프로그래밍 사상
대상을 향한 사상: 한 가지 일을 하고 이 일을 해결할 수 있는 대상을 찾아 대상을 호출하는 방법으로 일을 완성한다.
함수식 프로그래밍 사상: 결과를 얻을 수 있다면 누가 하든 어떻게 하든 중요하지 않다. 결과를 중시하고 과정을 중시하지 않는다.
함수식 사상은 대상을 향한 복잡한 문법을 최대한 소홀히 한다. 어떤 형식으로 하는 것이 아니라 무엇을 강조하는 것이다
1.1.2 Lambda 표현식의 도입
전통적인 루틴 실현 방식: 루틴을 시작하려면 Thread류의 대상을 만들고 start방법을 호출해야 한다.라인이 실행하는 내용을 지정하기 위해서는 Thread류의 구조 방법을 호출해야 한다.Runnable 인터페이스의 실현 대상을 얻기 위해 이 인터페이스에 실현 클래스RunnableImpl를 정의할 수 있습니다.
//  
public class RunnableImpl implements Runnable {
     
	@Override
	public void run() {
     
		System.out.println(" !");
	}
}

class RunnableImplTest {
     
	public static void main(String[] args) {
     
		Runnable task = new RunnableImpl();
		new Thread(task).start();
	}
}

익명 내부 클래스 사용: 이RunnableImpl 클래스는 Runnable 인터페이스를 실현하기 위해 존재하고 유일하게 사용되기 때문에 익명 내부 클래스의 문법을 사용하면 이 클래스의 단독 정의를 줄일 수 있습니다.
public class RunnableImplTest {
     
	public static void main(String[] args) {
     
		new Thread(new Runnable() {
     
			@Override
			public void run() {
     
				System.out.println(" !");
			}
		}).start();
	}
}

익명 내부 클래스는 클래스의 정의를 실현하는 데 도움을 줄 수 있지만 문법의 장점은 복잡하다
코드의 의미를 분석하면 알 수 있듯이 Runnable 인터페이스는 하나run 방법의 정의만 있다.
  • public abstract void run();

  • 즉, 일을 하는 방안을 제정했다(사실은 하나의 함수이다).
  • 매개 변수 없음: 어떠한 조건도 필요 없이 이 방안을 실행할 수 있습니다.
  • 반환값이 없습니다: 이 방안은 아무런 결과도 발생하지 않습니다.
  • 코드 블록(사각형): 이 방안의 구체적인 집행 절차.

  • 같은 의미는 Lambda 문법에 나타나므로 더욱 간단해야 한다.
    () -> System.out.println(" !")
    
  • 앞에 있는 작은 괄호 즉 run 방법의 매개 변수(없음)는 어떠한 조건도 필요하지 않다는 것을 의미한다.
  • 중간에 있는 화살표는 앞의 매개 변수를 뒤의 코드에 전달하는 것을 대표한다.
  • 뒤에 있는 출력 문장은 바로 업무 논리 코드이다.

  • 1.1.3 Lambda 표현식 표준 형식
    Lambda는 3가지 섹션으로 구성된 객체 지향 프레임을 생략했습니다.
  • 일부 매개 변수
  • 화살표 1개
  • 코드 한 토막
  • Lambda 표현식의 표준 형식은 다음과 같습니다.
    (   ) -> {   }
    

    형식 설명:
  • 소괄호 안의 문법은 전통적인 방법의 매개 변수 목록과 일치한다. 매개 변수가 없으면 비운다.여러 개의 매개 변수는 쉼표로 구분된다.
  • ->는 새로 도입된 문법 형식으로 지향 동작을 대표한다.
  • 괄호 안의 문법은 전통 방법체의 요구와 기본적으로 일치한다.

  • 1.1.4 Lambda 표현식 사용 사전 요구 사항
    Lambda의 문법은 매우 간결하여 대상을 향한 복잡한 속박이 전혀 없다.그러나 사용 시 주의해야 할 몇 가지 문제가 있다.
  • Lambda를 사용하려면 인터페이스가 있어야 하며 인터페이스에 추상적인 방법이 있어야 합니다.JDK 내장Runnable,Comparator 인터페이스든 사용자 정의 인터페이스든 인터페이스에 추상적인 방법이 존재하고 유일한 경우에만 Lambda를 사용할 수 있다.
  • Lambda를 사용하려면 컨텍스트 추정이 있어야 합니다.즉 메서드의 매개변수 또는 로컬 변수 유형이 Lambda에 해당하는 인터페이스 유형이어야 Lambda를 이 인터페이스의 인스턴스로 사용할 수 있습니다.

  • 비고: 추상적인 방법이 있는 인터페이스를'함수식 인터페이스'라고 부른다.
    1.1.5 Lambda 표현식(반환값 없음)
    public class RunnableImplTest {
         
    	public static void main(String[] args) {
         
    		new Thread(()->{
         
    				System.out.println(" !");
    		}).start();
    	}
    }
    

    1.1.6 Lambda 표현식(반환값 참조)
    예: 지정된 정렬 규칙으로 배열 정렬
    기존 쓰기 방식:
    public class ComparatorSort {
         
        public static void main(String[] args) {
         
          	//  
            Person[] array = {
         
            	new Person(" ", 19),
            	new Person(" ", 18),
           		new Person(" ", 20) };
    
          	//  
            Comparator<Person> comp = new Comparator<Person>() {
         
                @Override
                public int compare(Person o1, Person o2) {
         
                    return o1.getAge() - o2.getAge();
                }
            };
            Arrays.sort(array, comp); //  , Comparator 
    
            for (Person person : array) {
         
                System.out.println(person);
            }
        }
    }
    

    Lambda 표현식 사용:
    public class ComparatorSortLambda {
         
        public static void main(String[] args) {
         
            Person[] array = {
         
              	new Person(" ", 19),
            	new Person(" ", 18),
           		new Person(" ", 20) };
    
            Arrays.sort(array, (Person a, Person b) -> {
         
              	return a.getAge() - b.getAge();
            });
    
            for (Person person : array) {
         
                System.out.println(person);
            }
        }
    }
    

    1.1.7 Lambda 생략 형식
    람바다가 강조하는 것은'어떻게 하느냐'가 아니라'어떻게 하느냐'여서 컨텍스트에 따라 추론해 알 수 있는 정보는 모두 생략할 수 있다.
    ** 생략 규칙: ** Lambda 표준 형식에서 생략 쓰기 규칙은 다음과 같습니다.
  • 소괄호 안의 매개 변수의 유형은 생략할 수 있다.
  • 소괄호 안에 파라미터가 하나만 있으면 소괄호는 생략할 수 있다.
  • 대괄호 안에 문장이 하나 있을 경우 되돌아오는 값이 있든 없든 대괄호,return 키워드와 문장의 번호를 생략할 수 있다.

  • 항소 사례는 생략 규칙을 사용하여 다음과 같이 쓸 수 있다.
    public class LambdaOmit  {
         
    
        public static void main(String[] args) {
         
            Person[] array = {
         
                    new Person(" ", 19),
                    new Person(" ", 18),
                    new Person(" ", 20) };
    
            Arrays.sort(array, (a, b) -> a.getAge() - b.getAge());
    
            for (Person person : array) {
         
                System.out.println(person);
            }
        }
    }
    

    좋은 웹페이지 즐겨찾기