Amenable
Amenable's Blog
Amenable
  • λΆ„λ₯˜ 전체보기 (189)
    • πŸ“‚ JAVA (87)
      • μ΄νŽ™ν‹°λΈŒ μžλ°” (65)
      • μ£Όμš” κ°œλ… (22)
    • πŸ“‚ 개발 μ„œμ  (22)
      • μ‹€μš©μ£Όμ˜ ν”„λ‘œκ·Έλž˜λ¨Έ (1)
      • 객체지ν–₯의 사싀과 μ˜€ν•΄ (2)
      • 클린 μ½”λ“œ (8)
      • ν•¨κ»˜ 자라기 (1)
      • 그림으둜 λ°°μš°λŠ” HTTP&Network Basic (10)
    • πŸ“‚ λ°μ΄ν„°λ² μ΄μŠ€ (8)
      • κ°œλ… (8)
      • λ¬Έμ œν’€μ΄ (0)
    • πŸ“‚ λ„€νŠΈμ›Œν¬ (14)
      • κ°œλ… (6)
      • 성곡과 μ‹€νŒ¨λ₯Ό κ²°μ •ν•˜λŠ” 1%의 λ„€νŠΈμ›Œν¬ 원리 (8)
    • πŸ“‚ μŠ€ν”„λ§ (13)
      • κΈ°λ³Έ κ°œλ… (13)
    • πŸ“‚ WEB (5)
    • πŸ“‚ 자료ꡬ쑰 (12)
      • κ°œλ… (2)
      • μ •λ ¬ (8)
      • 트리 (2)
    • πŸ“‚ μ•Œκ³ λ¦¬μ¦˜ (10)
      • μ΅œμ†Œμ‹ μž₯트리 (2)
      • μ΅œλ‹¨ 경둜 (2)
      • λ¬Έμžμ—΄ (2)
      • ETC (4)
    • πŸ“‚ μ•Œκ³ λ¦¬μ¦˜_λ¬Έμ œν’€μ΄ (4)
      • BOJ_λ°±μ€€ (4)
    • πŸ“‚ ν”„λ‘œκ·Έλž˜λ° (3)
    • πŸ“‚ DevOps (2)
      • 배포 (2)
    • πŸ“‚ ν›„κΈ° (8)
      • μš°μ•„ν•œ ν…Œν¬μ½”μŠ€(ν”„λ¦¬μ½”μŠ€) (4)
      • 2023λ…„ (3)
      • 2024λ…„ (1)
    • πŸ“‚ 회고 (1)
      • 2023λ…„ (1)

λΈ”λ‘œκ·Έ 메뉴

  • πŸš€ GitHub

ν‹°μŠ€ν† λ¦¬

hELLO Β· Designed By μ •μƒμš°.
Amenable

Amenable's Blog

λžŒλ‹€μ‹(Lambda Expression) - (2)
πŸ“‚ JAVA/μ£Όμš” κ°œλ…

λžŒλ‹€μ‹(Lambda Expression) - (2)

2023. 1. 29. 12:42

  μ•žμ— 글에 μ΄μ–΄μ„œ λžŒλ‹€μ‹μ„ μ‚΄νŽ΄λ³΄μž. μ΄λ²ˆμ—λŠ” java.util.function νŒ¨ν‚€μ§€μ˜ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ™€ λ©”μ„œλ“œ 참쑰에 λŒ€ν•΄μ„œ μ•Œμ•„λ³Ό 것이닀.

 

1. ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ πŸ›

  ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•œ μ„€λͺ…이 ν•„μš”ν•˜λ‹€λ©΄ μ•žμ˜ 글을 μ°Έκ³ ν•˜κΈ°λ₯Ό λ°”λž€λ‹€. μ—¬κΈ°μ„œλŠ” java.util.functionμ—μ„œ μ œκ³΅ν•˜λŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ μ’…λ₯˜μ™€ μ‚¬μš©λ²•μ— λŒ€ν•΄μ„œλ§Œ μ•Œμ•„λ³΄κ³ μž ν•œλ‹€.

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ λ©”μ„œλ“œ μ„€λͺ…
 Runnable void run() λ§€κ°œλ³€μˆ˜ X, λ°˜ν™˜κ°’ X
Supplier<T> T get() λ§€κ°œλ³€μˆ˜ X, λ°˜ν™˜κ°’ O
Consumer<T> void accept(T t) λ§€κ°œλ³€μˆ˜ O, λ°˜ν™˜κ°’ X
Function<T, R> R apply(T t) λ§€κ°œλ³€μˆ˜ O, λ°˜ν™˜κ°’ O
Predicate<T> boolean test(T t) λ§€κ°œλ³€μˆ˜ O, λ°˜ν™˜κ°’ O(boolean)
public static void main(String[] args) {
    // λ§€κ°œλ³€μˆ˜ X, λ°˜ν™˜κ°’ X
    Runnable runnable = () -> System.out.println("Runnable Test");
    runnable.run();

    // λ§€κ°œλ³€μˆ˜ X, λ°˜ν™˜κ°’ O
    Supplier<String> supplier = () -> "Supplier Test";
    System.out.println(supplier.get());

    // λ§€κ°œλ³€μˆ˜ O, λ°˜ν™˜κ°’ X
    Consumer<String> consumer = (something) -> System.out.println(something + "을(λ₯Ό) μ–»μ—ˆμŠ΅λ‹ˆλ‹€.");
    consumer.accept("λ…ΈνŠΈλΆ");

    // λ§€κ°œλ³€μˆ˜ O, λ°˜ν™˜κ°’ O
    Function<Integer, Integer> multiplyByTwo = (a) -> a * 2;
    System.out.println(multiplyByTwo.apply(5));

    // λ§€κ°œλ³€μˆ˜ O, λ°˜ν™˜κ°’ boolean
    int avg = 80;
    Predicate<Integer> isBiggerThanAvg = (number) -> number < avg;
    System.out.println(isBiggerThanAvg.test(100));
}

// Runnable Test
// Supplier Test
// λ…ΈνŠΈλΆμ„(λ₯Ό) μ–»μ—ˆμŠ΅λ‹ˆλ‹€.
// 10
// false

 

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ λ©”μ„œλ“œ μ„€λͺ…
BiConsumer<T, U> void accept(T t, U u) λ§€κ°œλ³€μˆ˜ 2개, λ°˜ν™˜κ°’ X
BiPredicate<T, U> boolean test(T t, U u) λ§€κ°œλ³€μˆ˜ 2개, λ°˜ν™˜κ°’ O (boolean)
BiFunction<T, U, R> R apply(T t, U u) λ§€κ°œλ³€μˆ˜ 2개, λ°˜ν™˜κ°’ O
public static void main(String[] args) {
		// λ§€κ°œλ³€μˆ˜ 2개, λ°˜ν™˜κ°’ X
		BiConsumer<String, Integer> applyCompany = (company, count) -> 
			System.out.println(company + "νšŒμ‚¬μ— " + count + "번 μ§€μ›ν•˜μ˜€μŠ΅λ‹ˆλ‹€.");
		applyCompany.accept("ABC", 3);
		
		// λ§€κ°œλ³€μˆ˜ 2개, λ°˜ν™˜κ°’ O (boolean)
		int maxCount = 5;
		BiPredicate<Integer, Integer> canRedo = (count, maximum) -> count < maximum;
		System.out.println(canRedo.test(3, maxCount));
		
		// λ§€κ°œλ³€μˆ˜ 2개, λ°˜ν™˜κ°’ O
		BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;
		System.out.println(add.apply(3, 4));
	}
}

// ABCνšŒμ‚¬μ— 3번 μ§€μ›ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
// true
// 7

 

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ λ©”μ„œλ“œ μ„€λͺ…
UnaryOperator<T> T apply(T t) λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž… = λ°˜ν™˜κ°’μ˜ νƒ€μž…
BinaryOperator<T> T apply(T t, T t) λ§€κ°œλ³€μˆ˜ νƒ€μž… = λ°˜ν™˜κ°’μ˜ νƒ€μž…
(λ§€κ°œλ³€μˆ˜λŠ” 2개이고 λ‘˜μ˜ νƒ€μž…은 λ™μΌν•˜λ‹€.)
public static void main(String[] args) {
    // λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž… = λ°˜ν™˜κ°’μ˜ νƒ€μž… 
    UnaryOperator<Integer> multiplyByTwo = (a) -> a * 2;
    System.out.println(multiplyByTwo.apply(5));

    // λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž… = λ°˜ν™˜κ°’μ˜ νƒ€μž…
    // λ§€κ°œλ³€μˆ˜λŠ” 2개이고 λ‘˜μ˜ νƒ€μž…μ€ λ™μΌν•˜λ‹€.
    BinaryOperator<String> appendString = (a, b) -> a + b;
    System.out.println(appendString.apply("abc", "def"));
}

// 10
// abcdef

  μ»¬λ ‰μ…˜ ν”„λ ˆμž„μ›Œν¬μ˜ μΈν„°νŽ˜μ΄μŠ€μ— μΆ”κ°€λœ λ‹€μˆ˜μ˜ λ””ν΄νŠΈ λ©”μ„œλ“œλ“€ 쀑에 μΌλΆ€λŠ” μ•„λž˜μ™€ 같이 ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•œλ‹€.

μΈν„°νŽ˜μ΄μŠ€ λ©”μ„œλ“œ μ„€λͺ…
Collection boolean removeIf(Predicate<E> filter) 쑰건에 λ§žλŠ” μš”μ†Œλ₯Ό μ‚­μ œ
List void replaceAll(UnaryOperator<E> operator) λͺ¨λ“  μš”μ†Œλ₯Ό λ³€ν™˜ν•˜μ—¬ λŒ€μ²΄
Iterable void forEach(Consumer<T> action) λͺ¨λ“  μš”μ†Œμ— μž‘μ—… action을 μˆ˜ν–‰
Map V compute(K key, BiFunction(K, V, V> f) μ§€μ •λœ ν‚€μ˜ 값에 μž‘μ—… fλ₯Ό μˆ˜ν–‰
V computeIfAbsent(K key, Function<K, V> f) ν‚€κ°€ μ—†μœΌλ©΄, μž‘μ—… f μˆ˜ν–‰ ν›„ μΆ”κ°€
V computeIfPresent(K key, BiFunction<V, V, V> f) μ§€μ •λœ ν‚€κ°€ μžˆμ„ λ•Œ, μž‘μ—… f μˆ˜ν–‰
V merge(K key, V value, BiFunction<V, V, V> f) λͺ¨λ“  μš”μ†Œμ— λ³‘ν•©μž‘μ—… fλ₯Ό μˆ˜ν–‰
voi forEach(BiConsumber<K, V> action) λͺ¨λ“  μš”μ†Œμ— μž‘μ—… action을 μˆ˜ν–‰
void replaceAll(BiFunction<K, V, V> f) λͺ¨λ“  μš”μ†Œμ— μΉ˜ν™˜μž‘μ—… fλ₯Ό μˆ˜ν–‰
public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("κΉ€λ‚˜λ¬΄ 학생");
    list.add("μ΅œλ°”λ‹€ 학생");
    list.add("κΉ€κ³Όκ±°");
    list.add("λ°•ν˜„μ‹€");
    list.add("졜미래");

    System.out.println(list);

    list.removeIf(name -> name.contains("학생"));
    System.out.println(list);

    list.replaceAll(name -> name + " μ„ μƒλ‹˜");
    System.out.println(list);

    list.forEach(name -> System.out.print(name + ", "));
}
// [κΉ€λ‚˜λ¬΄ 학생, μ΅œλ°”λ‹€ 학생, κΉ€κ³Όκ±°, λ°•ν˜„μ‹€, 졜미래]
// [κΉ€κ³Όκ±°, λ°•ν˜„μ‹€, 졜미래]
// [κΉ€κ³Όκ±° μ„ μƒλ‹˜, λ°•ν˜„μ‹€ μ„ μƒλ‹˜, 졜미래 μ„ μƒλ‹˜]
// κΉ€κ³Όκ±° μ„ μƒλ‹˜, λ°•ν˜„μ‹€ μ„ μƒλ‹˜, 졜미래 μ„ μƒλ‹˜,

 

2. λ©”μ„œλ“œ μ°Έμ‘°(Method Reference) 🍱

  λžŒλ‹€μ‹μ„ μ΄μš©ν•˜μ—¬ λ„ˆλ¬΄λ‚˜λ„ κ°„λ‹¨ν•˜κ²Œ λ©”μ„œλ“œλ₯Ό ν‘œν˜„ν•  수 μžˆμ—ˆλ‹€. 근데, 이것보닀 더 κ°„λž΅ν•˜κ²Œ ν‘œν˜„ν•  수 μžˆμ„κΉŒ? λ©”μ„œλ“œ μ°Έμ‘°λΌλŠ” 방법을 μ΄μš©ν•˜μ—¬ λžŒλ‹€μ‹μ„ 더 κ°„λž΅ν•˜κ²Œ ν‘œν˜„ν•΄ 보자. λͺ¨λ“  λžŒλ‹€μ‹μ— 적용 κ°€λŠ₯ν•œ 것은 μ•„λ‹ˆκ³  λžŒλ‹€μ‹μ΄ ν•˜λ‚˜μ˜ λ©”μ„œλ“œλ§Œ ν˜ΈμΆœν•˜λŠ” κ²½μš°μ—λ§Œ μ‚¬μš©ν•  수 μžˆλ‹€.

μ’…λ₯˜ λžŒλ‹€ λ©”μ„œλ“œ μ°Έμ‘°
static λ©”μ„œλ“œ μ°Έμ‘° (x) -> ClassName.method(x) ClassName::method
μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ μ°Έμ‘° (obj.x) -> obj.method(x) ClassName::method
νŠΉμ • 객체 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ μ°Έμ‘° (x) -> obj.method(x) obj::method
// static λ©”μ„œλ“œ μ°Έμ‘°
Function<String, Integer> f1 = (String s) -> Integer.parseInt(s);
Function<String, Integer> f2 = Integer::parseInt;

// μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ μ°Έμ‘°
BiFunction<String, String, Boolean> f3 = (s1, s2) -> s1.equals(s2);
BiFunction<String, String, Boolean> f4 = String::equals;

// νŠΉμ • 객체 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ μ°Έμ‘°
MyClass obj = new MyClass();
Function<String, Boolean> f5 = (x) -> obj.equals(x);
Function<String, Boolean> f6 = obj::equals;

  λ©”μ„œλ“œ μ°Έμ‘°λ₯Ό μ‚¬μš©ν•˜λ©΄ λžŒλ‹€μ‹μ˜ 일뢀가 μƒλž΅μ΄ λœλ‹€. ν•˜μ§€λ§Œ μ»΄νŒŒμΌλŸ¬κ°€ μƒλž΅λœ 뢀뢄을 μΈν„°νŽ˜μ΄μŠ€μ™€ λ©”μ„œλ“œ μ„ μ–ΈλΆ€λ₯Ό ν†΅ν•΄μ„œ μ‰½κ²Œ μ•Œμ•„λ‚Ό 수 있기 λ•Œλ¬Έμ— λ¬Έμ œκ°€ λ˜μ§€ μ•ŠλŠ”λ‹€.

 

  μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ” λžŒλ‹€μ‹λ„ λ©”μ„œλ“œ 참쑰둜 λ³€ν™˜ν•  수 μžˆλ‹€.

Supplier<ClassA> s1 = () -> new ClassA();
Supplier<ClassA> s2 = ClassA::new;

Function<Integer, int[]> f1 = x -> new int[x];
Function<Integer, int[]> f2 = int[]::new;

  λžŒλ‹€μ‹κ³Ό λ©”μ„œλ“œ μ°Έμ‘°λ₯Ό μ•ŒκΈ΄ 해도 μ΅μˆ™ν•˜μ§€ μ•ŠμœΌλ©΄ 잘 μ‚¬μš©ν•˜μ§€ λͺ»ν•˜λŠ” κ±° κ°™λ‹€. 같이 μ—°μŠ΅ν•΄μ„œ μ–Όλ₯Έ μ΅μˆ™ν•΄μ§€λ„λ‘ ν•˜μž.

 

 

ν•΄λ‹Ή 글은 λ‚¨κΆ μ„±λ‹˜μ˜ Java의 정석을 읽고 μž‘μ„±ν•œ κ²ƒμž…λ‹ˆλ‹€.

'πŸ“‚ JAVA > μ£Όμš” κ°œλ…' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

μž…μΆœλ ₯(I/O)(2) - 직렬화(Serialization)  (2) 2023.01.29
μž…μΆœλ ₯(I/O)(1) - λ…Έλ“œ 슀트림, 보쑰 슀트림  (0) 2023.01.29
λžŒλ‹€μ‹(Lambda Expression) - (1)  (0) 2023.01.29
Comparableκ³Ό Comparator  (0) 2023.01.28
μ˜ˆμ™Έμ²˜λ¦¬(Exception Handling) - (2)  (0) 2023.01.28
    'πŸ“‚ JAVA/μ£Όμš” κ°œλ…' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • μž…μΆœλ ₯(I/O)(2) - 직렬화(Serialization)
    • μž…μΆœλ ₯(I/O)(1) - λ…Έλ“œ 슀트림, 보쑰 슀트림
    • λžŒλ‹€μ‹(Lambda Expression) - (1)
    • Comparableκ³Ό Comparator
    Amenable
    Amenable
    CS, μžλ°”, 자료ꡬ쑰, μ•Œκ³ λ¦¬μ¦˜, μŠ€ν”„λ§, μŠ€ν”„λ§ λΆ€νŠΈμ— ν•΄λ‹Ήν•˜λŠ” κ°œλ°œμ— κ΄€ν•œ λ‚΄μš©μ„ κ³΅μœ ν•©λ‹ˆλ‹€.

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”