ランダ式

35429 ワード

ランダ式

  • 匿名関数を生成する式
  • javaでは、「パラメータ付きコードブロック」が実行時に匿名実装オブジェクトとして生成される.
  • |형식| 인터페이스명 객체변수명 = 람다식;
    
    |람다식의 형식| (매개변수들...) -> {처리할 코드들;...}
  • ラムダ式に変換できるインタフェースは抽象的な方法しか使用できない.
    このインタフェースを「関数インタフェース」と呼びます.
  • は、関数インタフェースの作成時に@Functional Interfaceとして指定します.
  • 以前のスレッド宣言メソッドでは3番目に匿名クラスが使用されていました.Runnableの抽象的な方法はvoid run()で、最終的には関数インタフェースです!
    public class T01_LambdaTest {
    	public static void main(String[] args) {
    		// 람다식을 사용하지 않는경우
    		Thread th1 = new Thread(new Runnable() {
    			
    			@Override
    			public void run() {
    				for(int i =1; i<=10; i++) {
    					System.out.println(i);
    				}
    				
    			}
    		});
    		th1.start();
    		
    		//  람다식을 사용하는 경우
    		Thread th2 = new Thread(()->{
    			for(int i =1; i<=10; i++) {
    				System.out.println("람다 - "+i);
    			}
    			
    		});
    		th2.start();
    	}
    }

    ramフォーマットの作成方法

    기본형식 ) (자료형이름 매개변수명,...) -> {실행문들;...}
    1)パラメータの「資料型名称」は省略可能
    (int a) -> {System.out.println(a);}
    		(a) -> {System.out.println(a);}
    2)パラメータが1の場合は括弧「()」を省略できます.
    (ただし、「データ型名」を指定した場合、カッコは省略できません)
    a -> {System.out.println(a);}
    3)実行文が1つしかない場合は"{}"を省略できます
    (セミコロン(;))
    a -> System.out.println(a)
    4)括弧を省略できないパラメータが1つもない
     () -> System.out.println("안녕");
    5)戻り値がある場合はreturnコマンドを使用します.
    (a,b) -> { return a+b; }
    (a,b) -> return a+b
    6)実行文にreturnのみがある場合、returnコマンドと"{}"を省略できます.
    (a,b) -> a+b
    インタフェース
    // 함수적 인터페이스 => 추상메소드가 한개뿐인 인터페이스
    
    @FunctionalInterface
    public interface LambdaTestInterface1 {
    	// 반환값이 없고 매개변수도 없는 추상메소드 선언
    	public void test();
    
    }
    
    @FunctionalInterface
    interface LambdaTestInterface2 {
    	// 반환값이없고 매개변수는 있는 추상메소드 선언
    	public void test(int a);
    }
    
    @FunctionalInterface
    interface LambdaTestInterface3 {
    	// 반환값과 매개변수가 모두 있는 추상메소드 선언
    	public int test(int a, int b);
    }
    public class T02_LambdaTest {
    	
    	
    	public static void main(String[] args) {
    		
    	
    	// 람다식을 사용하지 않았을 경우
    	LambdaTestInterface1 lam1 = new LambdaTestInterface1() {
    		
    		@Override
    		public void test() {
    			System.out.println("안녕하세요");
    			System.out.println("익명 구현 객체 방식입니다");
    		}
    	};
    	
    	lam1.test(); //메서드 호출
    	
    	
    	LambdaTestInterface1 lam2 = () -> 
    		System.out.println("반가워요\n람다식으로 처리하는 방식입니다");
    	lam2.test();
    	
    	System.out.println("----------------------------------------------------");
    
    	
    	LambdaTestInterface2 lam3 =
    			(int z) -> {
    				int result = z+100;
    				System.out.println("result = "+result);
    			};
    			lam3.test(30);
    			
    	LambdaTestInterface2 lam4 = 
    			z -> {
    				int result = z+300;
    				System.out.println("result = "+result);
    			};
    	lam4.test(60);
    	
    	LambdaTestInterface2 lam5 =
    			z -> System.out.println("result = "+(z+500));
    	lam5.test(90);
    	System.out.println("---------------------------------");
    	
    	LambdaTestInterface3 lam6 =
    			(int x, int y)-> {
    				int r = x+y;
    				return r;
    			};
    	int k = lam6.test(20, 50);
    	System.out.println("k = "+k);
    	
    	
    	LambdaTestInterface3 lam7 =
    		(x,y)-> {
    			return x+y;
    		};
    	k = lam7.test(80, 50);
    	System.out.println("k= "+k);
    	
    	LambdaTestInterface3 lam8 =
    		(x,y) -> x+y;
    	k = lam8.test(100,200);
    	System.out.println("k = "+k);
    			
    			
    	LambdaTestInterface3 lam9 = 
    		(x,y) -> x > y ? x : y;
    	k = lam9.test(100, 200);
    	System.out.println("k = "+k);
    
    	
    	
    	
    }
    
    }

    final


    ラムダ式内部で使用される地域変数はfinalであるべきである.
    通常、finalを付けないとコンパイラが自動的に貼り付けられます
    ただし、領域変数値を変更する方法がある場合はfinalは自動的に貼り付けられません
    すなわち、匿名オブジェクトで領域変数を参照する場合、その領域変数はfinalでなければ参照できません.
    本来intと宣言しても自分でfinalを処理しますが、途中で値を変更する内容があるとfinalを変更できないためコンパイルエラーが発生します.
    public class T03_LambdaTest {
    	static int stVar = 9;
    	private String name = "aaa";
    	
    	public void testMethod(final int temp) {
    		final int localVar = 50;
    		int kor = 100;
    		
    		temp = 500; //error!
    		localVar = 2000; //error!
    		kor = 400;
    		
    		
    		// 람다식에서 지역변수 사용하기
    		LambdaTestInterface1 lam =
    				() -> {
    					System.out.println("tmep = "+temp);
    					System.out.println("localVar = "+localVar);
    					System.out.println("kor = "+kor); //error!
    					System.out.println("stVar = "+stVar);
    					System.out.println("this.name = "+this.name);
    				};
    				lam.test();
    		
    	}
    	
    	public static void main(String[] args) {
    		new T03_LambdaTest().testMethod(200);
    	}
    
    }

    listでram daエッチングを使用する

    import java.util.ArrayList;
    import java.util.List;
    import java.util.function.Consumer;
    
    public class T04_LambdaTest {
    	public static void main(String[] args) {
    		List<String> list = new ArrayList<String>();
    		list.add("홍길동");
    		list.add("이순신");
    		list.add("변학도");
    		
    		//
    		for(String str : list) {
    			System.out.println(str);
    		}
    		
    		
    		//
    		list.forEach(new Consumer<String>() {
    
    			@Override
    			public void accept(String t) {
    				System.out.println(t);
    				
    			}
    		});
    		
    		
    		// 람다식을 이용해 출력을 더 간단하게 표현 ( 알맹이는 위로 변해서 컴파일되는거 )
    		list.forEach((t) ->System.out.println(t));
    	}
    
    }