간단하고 알기 쉬운java8의 새로운 특성의lambda표현식 지식 총결

10314 단어 java8lambda표현식

개념


본질적으로 말하자면, 그것은 익명 함수로 인터페이스의 방법을 직접 실현하여 코드를 간소화할 수 있다.그러나 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표현식 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기