자바

JAVA STEP 46. lambda

2023. 2. 28. 22:44
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();
		}
		
	}
  • 실행결과
  • 나이순(내림차순) - 성별(내림차순) - 지역(가나다순)
  •  

lamdab식 실행결과

 

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
'자바' 카테고리의 다른 글
  • JAVA STEP 48. Stream
  • JAVA STEP 47. 함수형 인터페이스
  • JAVA STEP 45. LinkedList
  • JAVA STEP 44. File 입출력 예제
IT의 큰손
IT의 큰손
IT계의 큰손이 되고 싶은 개린이의 Log 일지
Developer Story HouseIT계의 큰손이 되고 싶은 개린이의 Log 일지
IT의 큰손
Developer Story House
IT의 큰손
전체
오늘
어제
  • 분류 전체보기 (457)
    • 정보처리기사 필기 (18)
    • 정보처리기사 실기 (12)
    • 정보처리기사 통합 QUIZ (12)
    • 빅데이터 (11)
    • 안드로이드 (11)
    • 웹페이지 (108)
    • 자바 (49)
    • SQLD (3)
    • 백준 알고리즘 (76)
    • 데이터베이스 (41)
    • 깃허브 (2)
    • Library (14)
    • Server (31)
    • 크롤링&스크래핑 (3)
    • Spring (23)
    • Vue.js (13)
    • React (27)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Developer Stroy House

인기 글

태그

  • 프론트엔드
  • java
  • 앱개발자
  • 정보보안전문가
  • it
  • IT자격증
  • jquery
  • 정보처리기사필기
  • 개발블로그
  • 데이터베이스
  • 정보처리기사
  • 웹개발
  • 알고리즘
  • React
  • 코딩테스트
  • IT개발자
  • 웹페이지
  • DB
  • DBA
  • html
  • ajax
  • 백준
  • IT자격증공부
  • JavaScript
  • 웹개발자
  • 자바
  • 개발자
  • 백엔드
  • css
  • jsp

최근 댓글

최근 글

Designed By hELLO
IT의 큰손
JAVA STEP 46. lambda
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.