1. 람다식에 대한 설명으로 틀린 것은 무엇입니까?
- 람다식은 함수적 인터페이스의 익명 구현 객체를 생성한다.
- 매개 변수가 없을 경우 ()->{...} 형태로 작성한다.
- {x, y} -> {return x+y;}는 (x, y)->x+y로 바꿀 수 있다.
@FunctionalInterface가 기술된 인터페이스만 람다식으로 표현이 가능하다.
2. 메소드 참조에 대한 설명으로 틀린 것은 무엇입니까?
- 메소드 참조는 함수적 인터페이스의 익명 구현 객체를 생성한다.
- 인스턴스 메소드는 "참조변수::메소드"로 기술한다.
- 정적 메소드는 "클래스::메소드"로 기술한다.
생성자 참조인 "클래스::new"는 매개 변수가 없는 디폴트 생성자만 호출한다.
3. 잘못 작성된 람다식은 무엇입니까?
- a -> a+3
a,b -> a*b- x -> System.out.println(x/5)
- (x,y) -> Math.max(x,y)
4. 다음 코드는 컴파일 에러가 발생합니다. 그 이유가 무엇입니까?
package org.chpater14;
import java.util.function.IntSupplier;
public class LamdaExample {
public static int method(int x, int y) {
IntSupplier supplier = () -> {
//오류가 나는 부분
x += 10;
int result = x + y;
return result;
};
int result = supplier.getAsInt();
return result;
}
public static void main(String[] args) {
System.out.println(method(3, 5));
}
}
답안:
람다식 안에 선언된 매개변수와 로컬 변수는 final 특성을 가지고 있어 데이터 변경이 불가능하다.
매개 변수 또는 로컬 변수를 람다식에서 읽는 것은 허용되지만, 람다식 내부 또는 외부에서 변경할 수 없다.
p.687
5. 다음은 배열 항목 중에 최대값 또는 최소값을 찾는 코드입니다. maxOrMin() 메소드의 매개값을 람다식으로 기술해보세요.
package org.chpater14;
import java.util.function.IntBinaryOperator;
import java.util.function.IntSupplier;
public class LamdaExample {
public static int[] scores = {10, 50, 3};
public static int maxOrMin(IntBinaryOperator operator) {
int result = scores[0];
for (int score : scores) {
result = operator.applyAsInt(result, score);
}
return result;
}
public static void main(String[] args) {
//코드 작성
int max = maxOrMin(
(x, y) -> {
if (x >= y) return x;
else return y;
}
);
System.out.println("최대값 : " + max);
//코드 작성
int min = maxOrMin(
(x, y) -> {
if (x <= y) return x;
else return y;
}
);
System.out.println("최대값 : " + min);
}
}
6. 다음은 학생의 영어 평균 점수와 수학 평균 점수를 계산하는 코드입니다. avg() 메소드를 선언해보세요.
package org.chpater14;
import java.util.function.ToIntFunction;
public class LamdaExample2 {
private static Student[] students =
{ new Student("홍길동", 90, 96),
new Student("류현수", 95, 93)
};
public static void main(String[] args) {
double englishAvg = avg(s -> s.getEnglishScore());
System.out.println("영어 평균 점수:" + englishAvg);
double mathAvg = avg(s -> s.getMathScore());
System.out.println("수학 평균 점수:" + mathAvg);
}
//avg() 메소드 작성
private static double avg(ToIntFunction<Student> function) {
int sum = 0;
for (Student student : students) {
sum += function.applyAsInt(student);
}
double avg = (double) sum / students.length;
return avg;
}
private static class Student {
private String name;
private int englishScore;
private int mathScore;
public Student(String name, int englishScore, int mathScore) {
this.name = name;
this.englishScore = englishScore;
this.mathScore = mathScore;
}
public String getName() {
return name;
}
public int getEnglishScore() {
return englishScore;
}
public int getMathScore() {
return mathScore;
}
}
}
7. 6번의 main() 메소드에서 avg()를 호출할 때 매개값으로 준 람다식을 메소드 참조로 변경해보세요.
double englishAvg = avg(s -> s.getEnglishScore());
-> double englishAvg = avg(Student::getEnglishScore);
double mathAvg = avg(s -> s.getMathScore());
-> double mathAvg = avg(Student::getMathScore);
반응형
'개념' 카테고리의 다른 글
[이것이 자바다] chapter.16 확인 문제 (0) | 2023.04.11 |
---|---|
[이것이 자바다] chapter.15 확인 문제 (0) | 2023.04.04 |
[이것이 자바다] chapter.13 확인 문제 (0) | 2023.04.03 |
[이것이 자바다] chapter.12 확인 문제 (0) | 2023.03.31 |
[이것이 자바다] chapter.11 확인 문제 (0) | 2023.02.22 |