Java의 람다식 및 방법 참조
개시하다
열어주셔서 감사합니다.
회사 후배에게 "스트림 API를 몰라요. 알려주세요!"그래서'어차피 교수님을 위해 자료를 만들면 젠에서 공개하지 않을까'생각했죠.
이 글에서는 StreamAPI에서 반드시 사용해야 하는'주모식과 방법 참조'와 관련해 목록의 교체 처리를 기존 방법에서 주모식, 방법 참조를 사용한 문법으로 전환하고 설명을 병행했다.
(이 제목의 StreamAPI는 부기로 공개될 예정입니다.)
※ StreamAPI는 아래 페이지에서 공개됩니다.
목록의 원격 처리를 예로 들다
이번에'목록의 교체'라는 수집 처리의 기본 방법을 기존의 방법에서 람다식, 방법 참조로 진화시켰다.
이번 예에서 사용한 불변 소장품은 다음과 같다.
final List<String> player = Arrays.asList("Imai","Takahasi","Masuda","Matsumoto","Matsuzaka");
;JDK8 예전의 방법으로 써주세요.
이것은 이 목록을 각 요소를 기록하고 출력하는 일반적인 방법이다.
// for文でループを回す(普通これが最初に思いつく。)
for (int i = 0; i < player.size(); i++){
System.out.println(player.get(i));
}
// 拡張for文(次にこれが思いつく。)
for (String name : player){
System.out.println(name);
}
출력 결과는 다음과 같다.Imai
Takahasi
Masuda
Matsumoto
Matsuzaka
이 코드를 쓸 때 거의'i< 맞죠?자신에게는 늘 이런 미혹이 있다.for문으로 쓴 코드는 지루하고 오류가 발생하기 쉽다.
이 모드는 작업 모음의 특정 색인 요소에만 적용됩니다.
(이제까지는 지난번에 소개한 내용과 같다.)
다음은 확장 for 문장입니다.이 교체는 뒷면에서 Iterator 인터페이스를 사용하고hasNext 방법과next 방법을 호출합니다.
특정 인덱스에서 모음집을 수정할 필요가 없기 때문에 for문장을 비교하면 더 좋은 스타일입니다.
출력 결과가 같습니다.
그러나 이 두 가지는 모두 명령형 코드로 현대 자바에서는 버릴 수 있다.
따라서 함수형 코드로 진화할 수 있다.
// playerコレクションに対してforEach()メソッドを呼び出し、匿名Consumerインスタンスを渡す。
player.forEach(new Consumer<String>(){
// ↓冗長なコード。
public void accept(final String name) {
System.out.println(name);
}
});
JDK8에 Iterable 인터페이스forEach
와 같은 특수한 방법이 추가되어 이 방법을 사용했다.forEach 방법은 Consummer형을 매개 변수로 하고 Consummer의 실례는 accept 방법에 따라 제시한 것으로 문자와 같이'소비'한다.
이번에는 모음집에 forEach 방법을 호출하여 익명Consumer 실례를 전달합니다.
forEach() 메서드에서 제공하는 Consumer incept 메서드를 사용하여 모음의 요소를 임의로 조작합니다.
이번에는 주어진 값만 출력합니다.출력 결과는 for 문장과 같습니다.
Imai
Takahasi
Masuda
Matsumoto
Matsuzaka
그러나 쓸데없는 것이기 때문에 (더 복잡하게 처리하면 쓸 수 없고 볼 수 없다) 이 문제를 해결할 방법을 생각하는 것은 낭비적이다.람다식
람다
이것은 JDK8 이후에 도입한 문법이다.
함수형 인터페이스 변수를 대입하는 곳에서 람다식을 제출할 수 있습니다.
람다식은 다음과 같은 느낌입니다.
friends.forEach(name -> System.out.print(name));
람다식 문법
람다식은 매개 변수부 ->로 주체 표현을 처리할 수 있다.
매개 변수 부분의 쓰기 방법은 다음과 같은 몇 가지가 있다.
型1 引数名1, 型2 引数名2, …
friends.forEach((final String name) -> System.out.print(name));
引数名1, 引数名2, …
friends.forEach((name) -> System.out.print(name));
引数名1
friends.forEach(name -> System.out.print(name));
람다식으로 써보도록 하겠습니다.
이것은
// ラムダ式の基本形
player.forEach((final String name) -> System.out.println(name));
1. 基本形
에서 소개한 문법이다.매개변수의 유형을 지정합니다.이어서
2. 型の省略
에 소개된 문법으로 변경해 봅시다.// パラメータの型情報を抜いた(型推論)
player.forEach((name) -> System.out.println(name));
매개 변수에서 지정한 유형이 분실되었습니다.이 때 자바 컴파일러는 상하문에 따라 파라미터
name
가 String型
라고 판단한다.컴파일러가 호출된 방법의 서명을 검색하고 이 방법이 매개 변수의 함수형 인터페이스에 사용되는 것을 분석합니다.그리고 인터페이스의 abstractメソッド
를 참조하여 파라미터의 수량과 각자의 유형을 판정한다.람다식을 설명할 때 모든 매개 변수에 형식 정보를 추가하거나 형식 정보를 전혀 추가하지 않습니다.
통과된 매개 변수는 하나입니다. 이 유형이 추론된다면 괄호를 다음과 같이 제거할 수 있습니다.(
3. かっこの省略
)// パラメータの型情報を抜き、括弧もなくす
player.forEach(name -> System.out.println(name));
출력 결과는 for문, 익명Consummer 실례를 사용할 때와 같습니다.람다식으로 쓰는 방법도 지루하다고 느끼는 사람이 있을 수 있다.이유는 두 번의 변수
name
가 있다.따라서 재사용 방법은 참조를 참조하여 재정의합니다.(자세한 내용은 뒤에 설명합니다.)
주체를 처리하는 기법은 다음과 같은 몇 가지가 있다.
{文1; 文2; … return 戻り値;}
(int n) -> {
System.out.println("test" + n);
return n + 1;
}
{文1; 文2; … }
(int n) -> {
System.out.println("test" + n);
}
文
戻り値の式
friends.forEach(name -> System.out.print(name));
3. かっこの省略
모드로 바뀌었다.방법 인용
방법 참조는
이것은 JDK8 이후에 도입한 문법이다.
방법 자체를 함수 인터페이스의 변수에 대입할 수 있다.
방법 참조는 다음과 같은 느낌입니다.
friends.forEach(System.out::print);
방법은 참조가 익숙하지 않으면 찾기 어렵지만 익숙해지면 읽을 수 있다.방법 인용 문법
방법 인용은 아래의 문법으로 쓸 수 있다.
// staticメソッドの場合
クラス名::メソッド名
// インスタンスメソッドの場合
インスタンス変数名::メソッド名
한 마디로 하면 호출하고자 하는 방법명 이전::
에서 방법의 매개 변수 부분(원괄호 부분)을 제외하면 방법 참조로 교부할 수 있다.기본적으로 람다식은 전달 매개 변수만 있으면 방법 참조로 바꿀 수 있다.
단,
パラメータを引数として渡す前に処理を行う場合
와 呼び出しの結果を返す前にその内容を修正しなければならない場合
는 방법 참조를 사용할 수 없습니다.사용 방법은 '목록의 직통 처리' 를 참조하여 써 보십시오.
// メソッド参照の登場
player.forEach(System.out::println);
출력 결과는 for문, 익명Consumer 실례, λ식과 같다.Java에서 코드 바디를 임의의 방법으로 바꿀 수 있습니다.
순환 처리가
forEachメソッド
에 숨겨져 있습니다.실장자는 명시할 필요가 없다."""그렇지, 나 왔어? i""맞지?"이렇게 하면 막연하지 않을 것이다.최후
끝까지 읽어주셔서 감사합니다.
만약 내용 등이 완비되지 않은 곳이 있다면 평론에서 저에게 알려주세요.
참고 자료
Reference
이 문제에 관하여(Java의 람다식 및 방법 참조), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/s_t_pool/articles/a00ccfcb23ea5fd941b2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)