간단하고 알기 쉬운java8의 새로운 특성의lambda표현식 지식 총결
개념
본질적으로 말하자면, 그것은 익명 함수로 인터페이스의 방법을 직접 실현하여 코드를 간소화할 수 있다.그러나 Lambda는 하나의 제한이 있어 인터페이스의 모든 방법을 실현할 수 없기 때문에 Lambda 표현식은 반드시 실현해야 할 방법 인터페이스만 사용할 수 있고 이 여섯 글자를 실현해야 한다는 것을 주의해야 한다.
public interface Printer {
// , Lambda
void print();
}
public interface Printer {
// , Lambda
void print();
// , ,
default void printDetail(){}
}
public interface Printer {
// , Lambda
void print();
// , , toString() Object .
String toString();
}
public interface Printer {
// , Lambda
void print();
// , , toString() Object .
String toString();
}
이와 같이 반드시 실현해야 할 방법이 하나밖에 없는 인터페이스는java8에서 함수식 인터페이스라고 하는데 인터페이스를 정의할 때 인터페이스 이름 위에 @FunctionInterface
라벨을 붙여서 이 인터페이스가 함수식 인터페이스인지 검증할 수 있다.만약 이 인터페이스가 정의된 후에 함수식 인터페이스가 아니라면, 인터페이스 이름에 오류가 발생할 것입니다.Lambda 표현식을 사용할 때 방법 이름을 주목할 필요가 없고 방법 매개 변수와 반환 값만 주목하면 됩니다.기본 구문은 간단합니다.
( )->{
};
2. 용법 비교
자바에서 인터페이스를 실현하는 방식은 자바8 이전에 두 가지가 있다. 인터페이스의 실현 클래스를 정의하고 익명 클래스를 사용하지만 Lambda 표현식은 이런 방법에 비해 매우 간단하다.위의 Printer 인터페이스를 예로 들면 다음과 같습니다.
2.1 구현 클래스
class PrinterImpl implements Printer{
@Override
public void print() {
System.out.println("Hello World");
}
}
2.2 익명 클래스
class PrinterAnonymous {
Printer printer = new Printer() {
@Override
public void print() {
System.out.println("Hello World");
}
};
}
2.3 Lambda
class PrinterLambda{
Printer p = ()-> System.out.println("Hello World");
}
위의 세 가지 실현 방식을 비교하면 람다의 실현이 앞의 두 가지보다 훨씬 간단하다는 것을 나타낸다.3. 기본 사용법
3.1 매개 변수가 없고 반환값이 없는 인터페이스 방법
@FunctionalInterface
public interface Printer {
void print();
}
public class Tester {
public static void main(String[] args) {
// , , ,
Printer p1 = () -> System.out.println("Hello World 1");
p1.print();
// ,
Printer p2 = () -> {
System.out.println("Hello World 2");
};
p2.print();
}
}
3.2 매개 변수에 반환값 인터페이스가 없는 방법
@FunctionalInterface
public interface Printer {
void print(String str);
}
public class Tester {
public static void main(String[] args) {
// , , ,
// , , :
//Printer p1 = s -> System.out.println(s);
Printer p1 = (s) -> System.out.println(s);
p1.print("Hello World 1");
// , , ,
Printer p2 = (String s) -> System.out.println(s);
p2.print("Hello World 2");
// ,
Printer p3 = (String s) -> {
System.out.println(s);
};
p3.print("Hello World 3");
}
}
3.3 여러 개의 매개 변수에 반환값 인터페이스가 없는 방법
@FunctionalInterface
public interface Printer {
void print(String str1,String str2);
}
public class Tester {
public static void main(String[] args) {
// , , ,
//
Printer p1 = (s1,s2) -> System.out.println(s1+" "+s2);
p1.print("Hello World 1","Java 1");
// , , ,
Printer p2 = (String s1,String s2) -> System.out.println(s1+" "+s2);
p2.print("Hello World 2","Java 2");
// ,
Printer p3 = (String s1,String s2) -> {
System.out.println(s1+" "+s2);
};
p3.print("Hello World 3","Java 3");
}
}
3.4 매개 변수가 없는 반환값 인터페이스 방법
@FunctionalInterface
public interface Printer {
boolean print();
}
public class Tester {
public static void main(String[] args) {
// , , ,return
Printer p1 = () -> true;
boolean has1 = p1.print();
System.out.println(has1);//
// ,
Printer p2 = () -> {return true;};
boolean has2 = p2.print();
System.out.println(has2);//
}
}
3.5 매개 변수에 반환값 인터페이스 방법
@FunctionalInterface
public interface Printer {
boolean print(boolean good);
}
public class Tester {
public static void main(String[] args) {
// , , ,return
// , , :
//Printer p1 = good -> good;
Printer p1 = (good) -> good;
boolean has1 = p1.print(true);
System.out.println(has1);
// ,
Printer p2 = (good) -> {return good;};
boolean has2 = p2.print(false);
System.out.println(has2);
}
}
3.6 여러 개의 매개 변수에 반환값 인터페이스 방법이 있다
@FunctionalInterface
public interface Printer {
boolean print(boolean good1,boolean good2);
}
public class Tester {
public static void main(String[] args) {
// , , ,return
Printer p1 = (good1,good2) -> good1;
boolean has1 = p1.print(true,false);
System.out.println(has1);
// ,
Printer p2 = (good1,good2) -> {return good1;};
boolean has2 = p2.print(false,false);
System.out.println(has2);
}
}
4. 함수 참조
하나의 인터페이스를 실현하는 방법을 실현할 때 기존의 다른 곳의 어떤 함수가 인터페이스 방법의 논리를 실현했다면 방법을 사용하여 이 논리를 직접 인용할 수 있다.
4.1 정적 방법 참조
구문:
= ::
참고 사항:Printer가 실현해야 할 방법은 Checker에서 똑같이 실현된다. 이렇게 하면 직접 인용할 수 있다
@FunctionalInterface
public interface Printer {
String print(boolean good1,boolean good2);
}
public class Checker {
public static String check(boolean a,boolean b) {
if(a && b) {
return "Java is good";
}else if (!a && b) {
return "Java is better";
}
return "Java is best";
}
}
public class Tester {
public static void main(String[] args) {
Printer p1 = Checker::check;//
System.out.println(p1.print(true, true));
}
}
4.2 비정적 방법 참조
구문:
= ::
참고 사항:Printer가 실현해야 할 방법은 Checker에서 똑같이 실현된다. 이렇게 하면 직접 인용할 수 있다
@FunctionalInterface
public interface Printer {
String print(boolean good1,boolean good2);
}
public class Checker {
public String check(boolean a,boolean b) {
if(a && b) {
return "Java is good";
}else if (!a && b) {
return "Java is better";
}
return "Java is best";
}
}
public class Tester {
public static void main(String[] args) {
Printer p1 = new Checker()::check;//
System.out.println(p1.print(true, true));
}
}
4.3 구조 방법의 인용
만약에 함수식 인터페이스에서 정의된 방법이 단지 하나의 대상을 얻기 위해서라면 우리는 구조 방법의 인용을 사용하여 이 방법의 실현을 간소화할 수 있다
구문:
= ::new
참고 사항:인터페이스의 방법 매개 변수를 통해 서로 다른 구조 방법을 구분하여 인용할 수 있다
예:
@FunctionalInterface
public interface Printer1 {
Checker getCheck();
}
@FunctionalInterface
public interface Printer2 {
Checker getCheck(int a);
}
public class Checker {
int times;
public Checker() {
System.out.println("I am none parameter");
}
public Checker(int a) {
System.out.println("I have one parameter");
}
}
public class Tester {
public static void main(String[] args) {
//
Printer1 p1 = Checker::new;
p1.getCheck();
//
Printer2 p2 = Checker::new;
p2.getCheck(1);
}
}
4.4 대상 방법의 특수 인용
만약 어떤 인터페이스를 실현할 때, Lambda 표현식에 어떤 대상이 포함되어 있으며, 이때 방법체에서 이 대상을 직접 사용하여 그 방법을 호출하면 전체 논리를 완성할 수 있다.다른 매개 변수는 호출 방법의 매개 변수로 사용할 수 있다.이때 이런 실현을 간소화할 수 있다.
예:
@FunctionalInterface
public interface Printer1 {
int getCheck(Checker checker);
}
@FunctionalInterface
public interface Printer2 {
void setCheck(Checker checker, int a);
}
public class Tester {
public static void main(String[] args) {
Checker checker = new Checker();
checker.setTimes(100);
// , lambda
Printer1 p1 = x -> x.getTimes();
System.out.println(p1.getCheck(checker));//
//
Printer1 p11 = Checker::getTimes;
System.out.println(p11.getCheck(checker));//
// , lambda
Printer2 p2 = (x,y)-> x.setTimes(y);
p2.setCheck(checker, 50);
System.out.println(checker.getTimes());//
//
Printer2 p22 = Checker::setTimes;
p22.setCheck(checker, 30);
System.out.println(checker.getTimes());//
}
}
5. 주의
Lambda 표현식에서 어떤 국부 변수를 사용하면 이 국부 변수의 값은 Lambda 표현식 외에 변경할 수 없습니다. 기본적으로final 상수로 정의되기 때문입니다.그러나 전역 변수 변수는 이 방면의 제한이 없다.
예:
@FunctionalInterface
public interface Printer {
void setTime();
}
public class Tester {
public static void main(String[] args) {
int time = 10;
Printer p = () -> System.out.println(time);// , time
time = 15;// ,
}
}
Lambda 표현식의 모든 용법을 기본적으로 요약하였습니다. 부족한 점은 양해해 주십시오. 감사합니다!간단하고 알기 쉬운java8의 새로운 특성에 대한lambda표현식 지식을 총결한 이 글을 소개합니다. 더 많은 관련 javalambda표현식 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Liquibase】DB 작성·테이블 정의 변경신규 스타터 프로젝트 작성 Liquibase와 MySQL 선택 application.properties에 DB 정보 넣기 MySQL에서 "testdatabase"라는 데이터베이스 만들기 빌드 종속성 추가 build....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.