카테고리 없음

기본 문법 복습 (8) 람다식과 메소드참조

개발하는 멍발자 2022. 4. 22. 15:41

record에서는 인수도 메소드를 호출하는 방식으로 사용하는 게 규칙이다.

그러므로 record 인수도 ()를 해 주는 것이 좋다.

public class InstanceMethodSample {

    record Student(String name, int englishScore, int mathScore){} //레코드는 중괄호 처리
    public static void main(String[] args) {
        var sage = new Student("sage", 60, 80); // int는 ""하지 말기
        var a = average(sage);
        System.out.println("평균점수: %d".formatted(a));

    }
    static int average(Student s) { //인스턴트의 Student를 가져와서 넣은 것
        return (s.englishScore() + s.mathScore()) / 2; // ()소괄호 필수 
    }
}

//결과
평균점수: 70

이름 넣어서 확장하기

public class InstanceMethodSample {

    record Student(String name, int englishScore, int mathScore) {
    //레코드는 중괄호 처리

    int average() {
        return (this.englishScore() + this.mathScore()) / 2;
    }

    int sum() {
        return this.englishScore() + this.mathScore();
    }
    void showResult() {
        System.out.println(this.name() + "님의 평균점수는 " + average() + "점입니다.");

    }
}

    public static void main(String[] args) {
        var sage = new Student("sage", 60, 80);
        var a = sage.average();
        var s = sage.sum();

        System.out.println("합계: %d".formatted(s));
        System.out.println("평균점수: %d".formatted(a));
        sage.showResult();

    }
    static int average(Student s) {
        return (s.englishScore() + s.mathScore()) / 2;
    }
}

//결과
합계: 140
평균점수: 70
sage님의 평균점수는 70점입니다.

람다식

 

람다식은 익명 메소드다

 

메소드를 람다식으로, 람다식을 메소드로 바꾸는 문제

 

boolean check(String s) { // 1. 이 메소드를 람다식으로 바꾸기
 return s.contains("y");
}
s -> s.contains("y") // 1번 답

void print(String s) { // 2. 이 메소드를 람다식으로 바꾸기
 S

s -> System.out.println(s) // 2번 답
    
    
s -> s.toUpperCase() // 3. 람다식을 메소드로 바꾸기    
String upper(String s) {
        return s.toUpperCase(); //3번의 답
        
s -> s.isEmpty() // 4.람다식을 메소드로 바꾸기

boolean empty(String s) {
           return s.isEmpty(); // 4번 답
        }

람다식으로 메소드 참조로 변환

 

인수 -> 무엇인가? 메소드 (인수) => 무엇인가::메소드

인수 -> 인수.메소드() => 메소드가 속한 클래스명::메소드

 

<람다식>

var names = List.of("홍길동", "이순신", "신사임당");
names.forEach(s -> System.out.println(s));

<메소드 참조>

var names = List.of("홍길동", "이순신", "신사임당");
names.forEach(System.out::println);

<메소드 참조와 람다식 변환>

names.stream().map(s -> s.toUpperCase()).toList() // 람다식
names.stream().map(String::toUpperCase).toList() // 메소드 참조

names.stream().map(s -> "%s님".formatted(s)).toList() // 람다식
names.stream().map("%s님"::formatted).toList() //메소드 참조

names.stream().map(String::toLowerCase).toList() // 메소드 참조
names.stream().map(s -> s.toLowerCase()).toList() //람다식

메소드 체인

jshell> var items = String.join("와 ", "참외", "오이")
items ==> "참외와 오이"

jshell> "쇼핑은 %s로 %d로".formatted(items, 8000)
$5 ==> "쇼핑은 참외와 오이로 8000로"

"three times".repeat("abc".length())을 변수를 사용하여 분해하기

jshell> var thing = "abc".length()
thing ==> 3

jshell> "three times".repeat(thing)
$7 ==> "three timesthree timesthree times"