Java의 람다식 및 방법 참조

15854 단어 Javatech

개시하다


열어주셔서 감사합니다.
회사 후배에게 "스트림 API를 몰라요. 알려주세요!"그래서'어차피 교수님을 위해 자료를 만들면 젠에서 공개하지 않을까'생각했죠.
이 글에서는 StreamAPI에서 반드시 사용해야 하는'주모식과 방법 참조'와 관련해 목록의 교체 처리를 기존 방법에서 주모식, 방법 참조를 사용한 문법으로 전환하고 설명을 병행했다.
(이 제목의 StreamAPI는 부기로 공개될 예정입니다.)
※ StreamAPI는 아래 페이지에서 공개됩니다.
https://zenn.dev/s_t_pool/articles/49200b65930aa8b28430

목록의 원격 처리를 예로 들다


이번에'목록의 교체'라는 수집 처리의 기본 방법을 기존의 방법에서 람다식, 방법 참조로 진화시켰다.
이번 예에서 사용한 불변 소장품은 다음과 같다.
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));
    
    매개 변수에서 지정한 유형이 분실되었습니다.
    이 때 자바 컴파일러는 상하문에 따라 파라미터nameString型라고 판단한다.컴파일러가 호출된 방법의 서명을 검색하고 이 방법이 매개 변수의 함수형 인터페이스에 사용되는 것을 분석합니다.그리고 인터페이스의 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;
    }
    
  • 반환값은void
  • 함수형 인터페이스 방법의 반환형이void일 때return문장을 생략할 수 있습니다.
  • 처리 주체의 정의 방법
  • {文1; 文2; … }
  • 예제
  • (int n) -> {
      System.out.println("test" + n);
    }
    
  • 괄호의 생략
  • 처리 주체가 한 문장만 있을 때 처리 주체를 둘러싼 파괄호를 생략할 수 있다.
  • 이 경우 반환 및 끝의 세미콜론 ";"묘사도 안 하고.
  • 처리 주체의 정의 방법
  • void로 되돌아오는 경우:
  • 반환값이void 이외의 경우: 戻り値の式
  • 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""맞지?"이렇게 하면 막연하지 않을 것이다.

    최후


    끝까지 읽어주셔서 감사합니다.
    만약 내용 등이 완비되지 않은 곳이 있다면 평론에서 저에게 알려주세요.

    참고 자료

  • java 비망록 람다식
  • java 비고 방법 참조
  • 자바 기반 함수형 프로그래밍 - 자바 8 람다식과Stream
  • 좋은 웹페이지 즐겨찾기