Java JVM (8): Lambda 소개

5585 단어 Java_JVM
왜 lambda 가 필요 합 니까?
lambda 문법
3. lambda 배합 Function 등 인터페이스 사용
4. lambda 배합 집합 사용
왜 lambda 가 필요 합 니까?
    
    
자바 는 대상 을 대상 으로 하 는 프로 그래 밍 방식 이다.lambda 는 함수 식 프로 그래 밍 에 속한다.자 바 는 왜 도입 합 니까?
    
    
1. 함수 식 인 터 페 이 스 를 결합 하면 중복 코드 를 많이 제거 할 수 있 습 니 다.예 를 들 면:
public class Test {
	public static void main(String[] args) throws InterruptedException {
		String name = "";
		String name1 = "12345";
		System.out.println(validInput(name, inputStr -> inputStr.isEmpty() ? "      ":inputStr));
		System.out.println(validInput(name1, inputStr -> inputStr.length() > 3 ? "    ":inputStr));
	}
	
	public static String validInput(String name,Function function) {
		return function.apply(name);
	}
}

    
    
상기 코드 는 lambda 표현 식 을 사 용 했 습 니 다. 이런 방식 을 사용 하지 않 으 면 if 문 구 를 많이 써 야 합 니 다.
    
    예 를 들 어 lambda 표현 식 은 익명 내부 클래스 를 대체 할 수 있 습 니 다.
    
    
    
    
2. 집합 하 는 흐름 식 조작 을 결합 하면 CPU 를 충분히 이용 하고 현대 다 핵 의 특성 을 이용 하여 효율 을 높 일 수 있다.예 를 들 면:
    //      25-35      、    
    public void boysAndGirls(List persons) {  
        Map result = persons.parallelStream().filter(p -> p.getAge()>=25 && p.getAge()<=35).  
            collect(  
                Collectors.groupingBy(p->p.getSex(), Collectors.summingInt(p->1))  
        );  
        System.out.print("boysAndGirls result is " + result);  
        System.out.println(", ratio (male : female) is " + (float)result.get(Person.MALE)/result.get(Person.FEMALE));  
    }  

    
    위의 parallelStream 방법, 즉 병렬 흐름 을 가 져 와 다 핵 특성 을 충분히 이용 하 는 것 입 니 다.
lambda 문법
    
    
세 부분 으로 구성: 
매개 변수 목록, 화살표 (->), 표현 식 또는 구문 블록
.
간단 한 예:
// 1.      ,     5  
() -> 5  
// 2.       (    ),   2     
x -> 2 * x  
// 3.   2   (  ),          
(x, y) -> x – y  
// 4.   2 int   ,        
(int x, int y) -> x + y  
// 5.      string   ,       ,      (       void)  
(String s) -> System.out.print(s)  

설명:
  • 매개 변수 유형 생략 - 절대 다수의 경우 컴 파일 러 는 상하 문 환경 에서 lambda 표현 식 의 매개 변수 유형 을 추정 할 수 있다.예 를 들 어 위의 두 번 째 x 와 세 번 째 (x, y) 는 유형 을 밝 히 지 않 았 다.
  • lambda 표현 식 의 매개 변수 개수 가 하나 일 때 작은 괄호 를 생략 할 수 있 습 니 다.위의 두 번 째 x
  • 와 같다.
  • lambda 표현 식 이 한 문장 만 포함 할 때 대괄호, return, 문장의 끝 에 있 는 분 호 를 생략 할 수 있 습 니 다.위 에서 돌아 오 면 return 이라는 물건 이 없습니다.
  • lambda 표현 식 은 외부 변수 에 접근 할 수 있 습 니 다 (외부 변 수 는 변 하지 않 습 니 다).

  • 3. lambda 배합 Function 등 인터페이스 사용
    다음 과 같이 Function, Consumer, Predicate 인터페이스의 사용 에 맞 춰 코드 의 번 거 로 움 을 줄 였 습 니 다.
    public class Test {
    	public static void main(String[] args) throws InterruptedException {
    		String name = "";
    		String name1 = "12345";
    		System.out.println(validInput(name, inputStr -> inputStr.isEmpty() ? "      ":inputStr));
    		System.out.println(validInput(name1, inputStr -> inputStr.length() > 3 ? "    ":inputStr));
    	}
    	
    	public static String validInput(String name,Function function) {
    		return function.apply(name);
    	}
    }
    public class Test {
    	public static void main(String[] args) throws InterruptedException {
    		String name = "";
    		String name1 = "12345";
    		
    		validInput(name, inputStr ->  
    				System.out.println(inputStr.isEmpty() ? "      ":"    "));
    		validInput(name1, inputStr ->
    				System.out.println(inputStr.isEmpty() ? "      ":"    "));
    		
    	}
    	public static void validInput(String name,Consumer function) {
    		function.accept(name);
    	}
    }
    public class Test {
    	public static void main(String[] args) throws InterruptedException {
    		String name = "";
    		String name1 = "12";
    		String name2 = "12345";
    		
    		System.out.println(validInput(name,inputStr ->  !inputStr.isEmpty() &&  inputStr.length() <= 3 ));
    		System.out.println(validInput(name1,inputStr ->  !inputStr.isEmpty() &&  inputStr.length() <= 3 ));
    		System.out.println(validInput(name2,inputStr ->  !inputStr.isEmpty() &&  inputStr.length() <= 3 ));
    		
    	}
    	public static boolean validInput(String name,Predicate function) {
    		return function.test(name);
    	}
    }

    4. lambda 배합 집합 사용
    //    String     ,              
    public void distinctPrimarySum(String... numbers) {  
        List l = Arrays.asList(numbers);  
        int sum = l.stream()  
            .map(e -> new Integer(e))  
            .filter(e -> Primes.isPrime(e))  
            .distinct()  
            .reduce(0, (x,y) -> x+y); // equivalent to .sum()  
        System.out.println("distinctPrimarySum result is: " + sum);  

        
        P: lambda 가 집합 에 맞 춰 사용 하 는 것 은 JDK 8 의 가장 중요 한 특성 일 것 입 니 다. 코드 를 간편 하 게 할 수 있 을 뿐만 아니 라 현대 다 핵 특성 도 충분히 이용 하여 각 방면 에서 효율 을 높 였 습 니 다.
    요약:
  • 람 다 도입: 코드 가 더욱 간단 하고 다른 사용 효율 이 높다.
  • lambda 문법: 기본 구성 은 매개 변수 목록, 화살표, 표현 식 으로 구성 되 어 있 습 니 다.매개 변수 목록 과 표현 식 이 간단 하 다 면 괄호 같은 것 도 생략 할 수 있 습 니 다.
  • Lambda 의 사용: 일반적으로 Function, Consumer, Predicate 또는 사용자 정의 함수 식 인터페이스 에 맞 춰 사용 하여 코드 를 더욱 편리 하 게 합 니 다.또한 집합 사용 에 협조 하여 효율 을 높이 고 읽 기 성 을 높 인 다.

  • 참고:
    1. Java8  Lambda 표현 식 이 왜 필요 합 니까?http://developer.51cto.com/art/201304/387681.htm
    2. 자바 8 초기 체험 (1) lambda 표현 식 문법:
    http://ifeve.com/lambda/

    좋은 웹페이지 즐겨찾기