Java JVM (8): Lambda 소개
5585 단어 Java_JVM
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)
설명:
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 의 가장 중요 한 특성 일 것 입 니 다. 코드 를 간편 하 게 할 수 있 을 뿐만 아니 라 현대 다 핵 특성 도 충분히 이용 하여 각 방면 에서 효율 을 높 였 습 니 다.
요약:
참고:
1. Java8 Lambda 표현 식 이 왜 필요 합 니까?http://developer.51cto.com/art/201304/387681.htm
2. 자바 8 초기 체험 (1) lambda 표현 식 문법:
http://ifeve.com/lambda/