Hamutaro - Hamtaro 4

Backend/Java

[JAVA] λžŒλ‹€μ‹κ³Ό 슀트림 ν•„ν„°

carsumin 2024. 4. 4. 14:08

 

λžŒλ‹€μ‹μ΄λž€?

JAVA8 λΆ€ν„° μ‚¬μš© κ°€λŠ₯ν•˜λ©°, 읡λͺ… ν•¨μˆ˜λ₯Ό ν‘œν˜„ν•˜λŠ” 방법

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° μŠ€νƒ€μΌμ„ 톡해 μ½”λ“œμ˜ 가독성이 λ†’μ•„μ§€κ³  λΆˆν•„μš”ν•œ λ°˜λ³΅μ„ 쀄인닀

 

λžŒλ‹€μ‹μ˜ κΈ°λ³Έ 문법

- 두 숫자의 합을 κ³„μ‚°ν•˜λŠ” λžŒλ‹€μ‹

(int a, int b) -> a + b

 

λžŒλ‹€μ‹μ˜ ꡬ성 μš”μ†Œ

1. λ§€κ°œλ³€μˆ˜ λͺ©λ‘

   - λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ€ μƒλž΅κ°€λŠ₯, μ»΄νŒŒμΌλŸ¬κ°€ νƒ€μž… 좔둠함

2. ν™”μ‚΄ν‘œ (->)

   - λ§€κ°œλ³€μˆ˜μ™€ λžŒλ‹€ 본문을 κ΅¬λΆ„ν•˜λŠ” 데 μ‚¬μš©

3. λžŒλ‹€ λ³Έλ¬Έ

   - ν•˜λ‚˜μ˜ ν‘œν˜„μ‹μ΄κ±°λ‚˜ μ€‘κ΄„ν˜Έλ‘œ μ—¬λŸ¬ ꡬ문을 κ°μŒ€ 수 μžˆλ‹€

 

λžŒλ‹€μ‹ 예제

// 기본적인 λžŒλ‹€μ‹ 예제
Runnable r = () -> System.out.println("Hello, World!");
r.run();
// 리슀트 μ •λ ¬
List<String> list = Arrays.asList("apple", "banana", "cherry");
list.sort((a, b) -> a.compareTo(b));
// ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ μ‚¬μš©
@FunctionalInterface
interface MathOperation {
    int operation(int a, int b);
}

public class LambdaTest {
    public static void main(String[] args) {
        MathOperation addition = (a, b) -> a + b;
        MathOperation subtraction = (a, b) -> a - b;

        System.out.println("10 + 5 = " + operate(10, 5, addition));
        System.out.println("10 - 5 = " + operate(10, 5, subtraction));
    }

    private static int operate(int a, int b, MathOperation op) {
        return op.operation(a, b);
    }
}

 

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ‘œ λžŒλ‹€μ‹μ„ μ‚¬μš©ν•˜λ €λ©΄ λŒ€μƒ νƒ€μž…μ€ λ°˜λ“œμ‹œ ν•˜λ‚˜μ˜ 좔상 λ©”μ„œλ“œλ§Œμ„ κ°€μ§€λŠ” μΈν„°νŽ˜μ΄μŠ€μ—¬μ•Ό ν•œλ‹€.

μ΄λŸ¬ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λΌκ³  ν•˜λŠ”λ°, μžλ°”8λΆ€ν„°λŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‰½κ²Œ μ •μ˜ν•  수 μžˆγ„·λ‘œγ…—γ„±

@FunctionalInterface μ–΄λ…Έν…Œμ΄μ…˜μ„ μ œκ³΅ν•œλ‹€.

 

슀트림 API

μžλ°”μ˜ collection 데이터 (ex: list, set λ“±)λ₯Ό μ²˜λ¦¬ν•˜λŠ” 데 μžˆμ–΄ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° μŠ€νƒ€μΌ 제곡

μŠ€νŠΈλ¦Όμ„ μ‚¬μš©ν•˜λ©΄ λ°μ΄ν„°μ†ŒμŠ€λ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³ λ„ λ°μ΄ν„°μ˜ 연속적인 λ³€ν™˜ 및 필터링 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€

 

슀트림 생성

// λ¦¬μŠ€νŠΈλ‘œλΆ€ν„° μŠ€νŠΈλ¦Όμ„ μƒμ„±ν•˜λŠ” 방법
List<String> list = Arrays.asList("apple", "banana", "cherry");
Stream<String> stream = list.stream();

 

슀트림 ν•„ν„°

// λ¬Έμžμ—΄ λ¦¬μŠ€νŠΈμ—μ„œ 길이가 5 μ΄ν•˜μΈ λ¬Έμžμ—΄λ§Œ 필터링
List<String> list = Arrays.asList("apple", "banana", "cherry", "date");
List<String> filteredList = list.stream()
    .filter(s -> s.length() <= 5)
    .collect(Collectors.toList());

System.out.println(filteredList); // 좜λ ₯: [apple, cherry, date]
// λžŒλ‹€μ‹κ³Ό 슀트림 ν•„ν„°λ₯Ό μ‚¬μš©ν•œ 데이터 처리
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return name + " (" + age + ")";
    }
}

public class LambdaStreamExample {
    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
            new Person("John", 20),
            new Person("Jane", 17),
            new Person("Tom", 23),
            new Person("Lucy", 15)
        );

        List<Person> adults = people.stream()
            .filter(p -> p.age >= 18)
            .collect(Collectors.toList());

        adults.forEach(System.out::println); // 좜λ ₯: John (20), Tom (23)
    }
}