Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 프로그래머스
- 개발자
- n^2 배열 자르기
- 프로그래밍
- 자바스크립트
- 코딩
- 파일 저장
- 세션
- MySQL
- jdbc
- 유튜브
- 형태소 분석기
- 입출력
- 모바일
- 메모장
- Python
- javascript
- 셀레니움
- js
- 이진 변환 반복하기
- 자바
- 크롤링
- Programmers
- 개발
- 데이터베이스
- jsp
- android
- 파이썬
- 함수형 인터페이스
- java
Archives
- Today
- Total
개인용 복습공간
[Java] 람다식과 함수형 인터페이스 - 1 본문
첫 포스팅이라 부족함이 있을 수 있음
람다식
자바에서는 함수형 인터페이스의 구현 객체로 취급한다. 메서드를 포함하는 익명 구현 객체를 전달할 수 있는 코드를 의미한다
람다식의 특징 은 여러 가지가 있다
- 메서드와 달리 이름이 없다
- 메서드와 달리 특정 클래스에 종속되지 않지만, 매개변수, 반환 타입, 본체를 가지며, 심지어 예외도 처리할 수 있다
- 메서드의 인수로 전달될 수도 있고 변수에 대입될 수 있다
- 익명 구현 객체와 달리 메서드의 핵심 부분만 포함한다
람다식의 문법 은 간단하다
예를 들어, (x, y) -> { return x + y }; 이런 식으로 작성하면 된다
함수형 인터페이스
함수형 인터페이스란 추상 메서드가 1개만 있는 인터페이스를 의미한다
매개 값 ------> 함수형 인터페이스 ------> 반환 값 이런 느낌이다.
java.util.function 패키지가 제공하는 함수형 인터페이스 종류
이외에도 BiPredicate와 같은 다양한 변종들이 있다. java.util.function 패키지가 제공하는 함수형 인터페이스는 추상 메서드 외 다양한
디폴트 메서드나 정적 메서드도 제공한다.
람다식 활용 문제
간단하게 Car리스트와 람다식, 함수형 인터페이스를 이용한 예제를 해보려 한다 (자세한 내용은 주석으로 설명해 두었다)
Car.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
import java.util.Arrays;
import java.util.List;
//필요한 함수형 인터페이스 (1)
@FunctionalInterface//함수형 인터페이스의 조건을 갖추었는지에 대한 검사를 컴파일러에게 요청 -> 아니면 오류출력
interface CarConsumer{
void apply(Car car); // 입출력 출력이 있음
}
//필요한 함수형 인터페이스 (2)
@FunctionalInterface
interface CarPredicate{
boolean test(Car car); //전달 인자를 근거로 참 또는 거짓을 반환하는 메소드
}
public class Car {
//매개변수
private String model;
private boolean gasoline;
private int age;
private int mileage;
//생성자
public Car(String model, boolean gasoline, int age, int mileage) {
this.model = model;
this.gasoline = gasoline;
this.age = age;
this.mileage = mileage;
}
//메소드
public String getModel() {return model;}
public boolean isGasoline() {return gasoline;}
public int getAge() {return age;}
public int getMileage() {return mileage;}
public String toString() {
return String.format("Car(%s,%s,%d,%d)", model, gasoline, age, mileage);
}
//Car리스트
public static final List<Car> cars = Arrays.asList(
new Car("소나타", true, 18, 210000),
new Car("코란도", false, 15, 200000),
new Car("그랜저", true, 12, 150000),
new Car("싼타페", false, 10, 220000),
new Car("아반테", true, 10, 70000),
new Car("에쿠스", true, 6, 100000),
new Car("그랜저", true, 5, 80000),
new Car("소나타", true, 2, 35000),
new Car("쏘렌토", false, 1, 10000),
new Car("아반테", true, 1, 7000));
}
|
cs |
CarDemo.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
import java.util.ArrayList;
import java.util.List;
public class CarDemo {
public static void main(String[] args) {
//디젤 자동차만 모두 찾기
List<Car> dieselCars = findCars(Car.cars, c -> !c.isGasoline());
System.out.println("디이젤 자동차 = " + dieselCars);
//10년보다 오래된 자동차만 모두 찾기
List<Car> oldCars = findCars(Car.cars, c -> c.getAge()>10);
System.out.println("오래된 자동차 = " + oldCars);
//10년보다 오래된 디젤 자동차만 모두 찾기
List<Car> oldDieselCars = findCars(Car.cars, c -> c.getAge()>10 && !c.isGasoline());
System.out.println("오래된 디이젤 자동차 = " + oldDieselCars);
//디젤 자동차를 출력하되 모델과 연식만 나타나도록 출력
System.out.print("디이젤 자동차 = ");
printCars(dieselCars, c -> System.out.printf("%s(%d) ", c.getModel(), c.getAge()));
//10년보다 오래된 자동차를 출력하되 모델, 연식, 주행거리만 출력
System.out.print("\n오래된 자동차 = ");
printCars(oldCars, c -> System.out.printf("%s(%d, %d) ", c.getModel(), c.getAge(), c.getMileage()));
}
//람다식으로 디젤 or 오래된 자동차 or 오래되고 디젤 인 자동차를 구별해서 출력한다.
private static List<Car> findCars(List<Car> all, CarPredicate cp) {
List<Car> result = new ArrayList<>();
for (Car car : all) {
if(cp.test(car))
result.add(car);
}
return result;
}
//이미 구분된 자동차를 사용해서 함수형 인터페이스를 이용해 원하는 정보만 출력한다.
public static void printCars(List<Car> all, CarConsumer cc) {
for (Car car : all) {
cc.apply(car);
}
}
}
|
cs |
간단하게 말하면 Car리스트를 함수형 인터페이스와 람다식을 이용하여 필요한 정보만 출력하는 예시다
'Java' 카테고리의 다른 글
[Java] 파일 채널 ,메모장 만들기 -3 (0) | 2021.05.25 |
---|---|
[Java] 메모장 만들기 - 2 (0) | 2021.05.21 |
[Java] 메모장 만들기 - 1 (0) | 2021.05.19 |
[Java] 스트림과 스트림을 이용한 입출력 (0) | 2021.05.18 |
[Java] 람다식과 함수형 인터페이스 - 2 (0) | 2021.05.12 |
Comments