728x90
★ lambda(람다식)
- 함수형 프로그래밍 방식을 지원하는 표현식
- 람다식을 사용하면 코드 일부가 간결해진다.
- JAVA 8 출시
- 목적 > 컬렉션(배열) 조작
- 자바의 메소드를 표현하는 방법 중 하나로 사용 - 자바의 람다식은 인터페이스를 사용해서 만든다.
- 람다식을 저장하는 인터페이스는 반드시 functional interface 이어야 한다. (추상 메소드를 딱 1개만 가져야한다.) >
- 자바의 람다식은 익명 객체를 만드는 표현을 간소화시킨 기술이다.
- 람다식은 메소드를 대신하는 코드블럭이다.
★ 람다식 형식
- 인터페이스 변수 = 람다식
- MyInterface m3 = () -> {};
★ (매개변수) -> {};
- a. (매개변수) : 메소드의 인자리스트
- b. -> : 화살표(Arrow), 구현부를 호출하는 역할
- c. {구현부} : 메소드의 구현부
- ex)
1번은 기존 메소드
2번은 람다식을 사용한 메소드
1. public void test() {
syso
}
//익명 메소드(함수)
2. () -> { syso
}
■ ex) 요구사항 : MyInterface를 구현한 객체를 생성하시오.
- 소스코드
- 여기서 주의할점 Tip : 람다식은 추상메소드를 딱 1개만 가지고 있어야 한다. (functional interface)
-- 기존 메소드 생성
//1. 클래스 + 객체
MyInterface m1 = new MyClass();
m1.test();
//2. 익명 객체
MyInterface m2 = new MyInterface() {
@Override
public void test() {
System.out.println("익명 클래스에서 구현한 메소드");
}
};
m2.test();
//2. 람다식
MyInterface m3 = () -> {
System.out.println("람다식으로 구현한 메소드");
};
m3.test();
TestInterface t1 = new TestInterface() {
@Override
public void bbb() {
System.out.println("B");
}
@Override
public void aaa() {
System.out.println("A");
}
};
■ ex2) 요구사항 : 추상메소드 형식에 따라 (매개변수 O,X | 반환값 O,X)
- 소스코드
NoParameterNoReturn pr1 = new NoParameterNoReturn() {
@Override
public void call() {
System.out.println("pr1");
}
};
pr1.call();
NoParameterNoReturn pr2 = () -> {
System.out.println("pr2");
};
pr2.call();
// 람다식 구현부에 실행문장이 1줄이면 {} 생략할 수 있다.
NoParameterNoReturn pr3 = () -> System.out.println("pr3");
pr3.call();
//void call(int n);
ParameterNoReturn pr4 = (int n) -> {
System.out.println("pr4 : " + n);
};
pr4.call(100);
// 매개변수의 자료형을 생략할 수 있다.
ParameterNoReturn pr5 = (n) -> {
System.out.println("pr5: " + n);
};
pr5.call(400);
//매개변수의 ()를 생략할 수 있다.
ParameterNoReturn pr6 = n -> {
System.out.println("pr6 : " + n);
};
pr6.call(500);
ParameterNoReturn pr7 = n -> System.out.println("pr7 : "+n);
pr7.call(600);
//void call(String name, int age);
MultiParameterNoReturn pr8 = (String name, int age) -> {
System.out.println("pr8 : " + name + "," + age);
};
pr8.call("홍길동", 20);
MultiParameterNoReturn pr9 = (name, age) -> {
System.out.println("pr8 : " + name + "," + age);
};
pr9.call("홍길동", 20);
//** 매개변수의 ()는 매개변수가 1개일 경우에만 생략 가능하다.
// MultiParameterNoReturn pr10 = name, age -> {
// System.out.println("pr8 : " + name + "," + age);
// };
NoParameterReturn pr11 = () -> {
return 100;
};
System.out.println("pr11 : " + pr11.call());
//*** 구현부에 return문이 유일하면, {}와 return을 생략할 수 있다.
NoParameterReturn pr12 = () -> 200;
System.out.println("pr12 : " + pr12.call());
//int call(int a, int b);
ParameterReturn pr13 = (int a, int b) -> {
return a + b;
};
System.out.println("pr13 : " + pr13.call(10, 20));
ParameterReturn pr14 = (a, b) -> a+b;
System.out.println("pr14 : " + pr14.call(30, 40));
}
interface NoParameterNoReturn {
void call();
}
interface ParameterNoReturn {
void call(int n);
}
interface MultiParameterNoReturn {
void call(String name, int age);
}
interface NoParameterReturn {
int call();
}
interface ParameterReturn {
int call(int a, int b);
}
■ ex3) 요구사항 : 람다식을 사용한 정렬 방법
- 소스코드
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
for(int i=0; i<20; i++) {
list.add((int)(Math.random() * 100)+1);
}
System.out.println(list);
list.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
System.out.println(list);
list.sort((o1,o2) -> o2 - o1);
System.out.println(list);
}
■ 람다식을 이용한 txt파일을 읽어와 정렬하기
- user.txt 파일을 읽어와 종류에 따라 정렬
- 소스코드
- User 클래스
class User {
private String no;
private String name;
private int age;
private String gender;
private String city;
private String tel;
public User(String no, String name, int age, String gender, String city, String tel) {
super();
this.no = no;
this.name = name;
this.age = age;
this.gender = gender;
this.city = city;
this.tel = tel;
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
@Override
public String toString() {
return "User [no=" + no + ", name=" + name + ", age=" + age + ", gender=" + gender + ", city=" + city + ", tel="
+ tel + "]";
}
}
- 단일 정렬
- 소스코드
private static void m2() {
ArrayList<User> list = new ArrayList<User>();
try {
BufferedReader reader = new BufferedReader(new FileReader("/Users/kimdaehwan/Desktop/class/code/java/JavaTset/dat/user.txt"));
String line = null;
while((line = reader.readLine()) != null) {
String [] temp = line.split(",");
User user = new User(
temp[0],
temp[1],
Integer.parseInt(temp[2]),
temp[3],
temp[4],
temp[5]
);
list.add(user);
}
reader.close();
//System.out.println(list);
for(User user : list) {
System.out.println(user.getNo() + " : " + user.getName());
}
System.out.println();
//나이순 정렬
list.sort((u1, u2) -> u1.getAge() - u2.getAge());
//이름순 정렬
list.sort((u1, u2) -> u1.getName().compareTo(u2.getName()));
//성별순
list.sort((u1, u2) -> u1.getGender().compareTo(u2.getGender()));
//지역순
list.sort((u1, u2) -> u1.getCity().compareTo(u2.getCity()));
//지역순(사용자 정의)
list.sort((u1,u2) -> {
int a1 = 0; //u1의 지역
int a2 = 0; //u2의 지역
if(u1.getCity().equals("서울")) a1 = 1;
else if(u1.getCity().equals("인천")) a1 = 2;
else if(u1.getCity().equals("천안")) a1 = 3;
else if(u1.getCity().equals("대전")) a1 = 4;
else if(u1.getCity().equals("강릉")) a1 = 5;
else if(u1.getCity().equals("광주")) a1 = 6;
else if(u1.getCity().equals("부산")) a1 = 7;
if(u2.getCity().equals("서울")) a2 = 1;
else if(u2.getCity().equals("인천")) a2 = 2;
else if(u2.getCity().equals("천안")) a2 = 3;
else if(u2.getCity().equals("대전")) a2 = 4;
else if(u2.getCity().equals("강릉")) a2 = 5;
else if(u2.getCity().equals("광주")) a2 = 6;
else if(u2.getCity().equals("부산")) a2 = 7;
return a1-a2;
});
for(User user : list) {
System.out.printf("%s. %s(%d) %s %s\n"
, user.getNo()
, user.getName()
, user.getAge()
, user.getGender()
, user.getCity());
}
System.out.println();
}catch (Exception e) {
e.printStackTrace();
}
}
- 다중 정렬
- 소스코드
private static void m3() {
ArrayList<User> list = new ArrayList<User>();
try {
BufferedReader reader = new BufferedReader(new FileReader("/Users/kimdaehwan/Desktop/class/code/java/JavaTset/dat/user.txt"));
String line = null;
while((line = reader.readLine()) != null) {
String [] temp = line.split(",");
User user = new User(
temp[0],
temp[1],
Integer.parseInt(temp[2]),
temp[3],
temp[4],
temp[5]
);
list.add(user);
}
reader.close();
//다중 정렬
//1차 정렬. 나이 정렬
//2차 정렬. 성별 정렬
//3차 정렬. 도시 정렬
list.sort((u1, u2) -> {
if(u1.getAge() > u2.getAge()) {
return -1;
}else if (u1.getAge() < u2.getAge()) {
return 1;
}else {// if (u1.getAge() == u2.getAge()){
if(u1.getGender().compareTo(u2.getGender()) > 0) {
return -1;
}else if (u1.getGender().compareTo(u2.getGender()) < 0) {
return 1;
}else {
if(u1.getCity().compareTo(u2.getCity()) > 0) {
return 1;
}else if(u1.getCity().compareTo(u2.getCity()) < 0) {
return -1;
}else {
return 0;
}
}
}
});
for(User user : list) {
System.out.printf("%s. %s(%d) %s %s\n"
, user.getNo()
, user.getName()
, user.getAge()
, user.getGender()
, user.getCity());
}
System.out.println();
} catch (Exception e) {
e.printStackTrace();
}
}
- 실행결과
- 나이순(내림차순) - 성별(내림차순) - 지역(가나다순)
728x90
'자바' 카테고리의 다른 글
JAVA STEP 48. Stream (0) | 2023.03.02 |
---|---|
JAVA STEP 47. 함수형 인터페이스 (0) | 2023.03.02 |
JAVA STEP 45. LinkedList (0) | 2023.02.28 |
JAVA STEP 44. File 입출력 예제 (0) | 2023.02.27 |
JAVA STEP 43. File 입출력 (0) | 2023.02.27 |