ランダ式
35429 ワード
ランダ式
|형식| 인터페이스명 객체변수명 = 람다식;
|람다식의 형식| (매개변수들...) -> {처리할 코드들;...}
このインタフェースを「関数インタフェース」と呼びます.
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));
}
}
Reference
この問題について(ランダ式), 我々は、より多くの情報をここで見つけました
https://velog.io/@cheshirehyun/람다식
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
기본형식 ) (자료형이름 매개변수명,...) -> {실행문들;...}
(int a) -> {System.out.println(a);}
(a) -> {System.out.println(a);}
a -> {System.out.println(a);}
a -> System.out.println(a)
() -> System.out.println("안녕");
(a,b) -> { return a+b; }
(a,b) -> return a+b
(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でなければ参照できません.
本来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));
}
}
Reference
この問題について(ランダ式), 我々は、より多くの情報をここで見つけました https://velog.io/@cheshirehyun/람다식テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol