자바의 Stream Method

2023. 9. 12. 11:52JAVA

반응형

여러가지 자바의 스트림 메소드를 알아보도록 하겠다.

일단 User 엔티티를 하나 생성한다.

public class User {
    private int id;
    private String name;
    private String email;

    public User(int id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

 

사용자 목록을 생성하고 "System.out::println", "User::getEmail"과 같은 메서드 레퍼런스를 이용해서 원하는 목록을 출력하는 예시이다.

// 사용자 목록 생성
List<User> userList = new ArrayList<>();
userList.add(new User(1001, "John Doe", "john@example.com"));
userList.add(new User(1002, "Jane Smith", "jane@example.com"));
userList.add(new User(1003, "Bob Johnson", "bob@example.com"));

// 메서드 레퍼런스를 이용한 사용자 목록 출력
userList.forEach(System.out::println);

// 사용자 목록에서 이메일만 추출하여 출력하는 메서드 레퍼런스
userList.stream()
        .map(User::getEmail)
        .forEach(System.out::println);

 

만약 사용자 목록에서 이메일에 "naver"가 들어가는 사용자를 찾아서 이메일을 기준으로 내림차순으로 정렬하고싶다면 여러 스트림 메소드를 활용해서 할 수 있다.

 // 사용자 목록 생성
List<User> userList = new ArrayList<>();
userList.add(new User(1001, "John Doe", "john@example.com"));
userList.add(new User(1002, "Jane Smith", "jane@example.com"));
userList.add(new User(1003, "Bob Johnson", "bob@example.com"));
userList.add(new User(1004, "Alice Naver", "alice@naver.com"));
userList.add(new User(1005, "Eve Naver", "eve@naver.com"));

// "naver"를 포함한 이메일을 가진 사용자를 필터링하고 이메일을 내림차순으로 정렬
List<User> filteredAndSortedUsers = userList.stream()
        .filter(user -> user.getEmail().contains("naver"))
        .sorted(Comparator.comparing(User::getEmail).reversed())
        .collect(Collectors.toList());

// 결과 출력
filteredAndSortedUsers.forEach(System.out::println);

위 코드에서는 'filter' 메서드를 사용해서 "naver"를 포함하는 이메일을 가진 사용자만 필터링하고, 'sorted' 메서드를 사용하여 내림차순으로 정렬했다. 또한 'collect' 메서드를 사용하여 결과를 리스트로 수집하고 결과를 출력한다.

이외에도 여러가지 다양한 스트림 메서드를 살펴보겠다.

  1. map(): 스트림의 각 요소를 특정 함수를 사용하여 변환한다. 예를 들어, 리스트의 모든 요소를 제곱하거나 문자열을 대문자로 바꿀 수 있다.
  2. flatMap(): 스트림의 각 요소를 다른 스트림으로 변환한 다음 이를 하나로 합친다. 이것은 중첩된 컬렉션의 요소를 평탄화하거나 매핑된 요소를 병합하는 데 유용하다.
  3. reduce(): 스트림의 요소를 이용하여 값을 하나로 줄인다. 예를 들어, 모든 요소를 합산하거나 최댓값을 찾는 데 사용할 수 있다.
  4. distinct(): 스트림에서 중복된 요소를 제거한다.
  5. limit() 및 skip(): limit(n)은 스트림에서 처음 n개의 요소만을 포함하고, skip(n)은 처음 n개의 요소를 건너뛴 나머지 요소만을 포함한다.
  6. anyMatch(), allMatch(), noneMatch(): 스트림의 요소 중 일부나 모두가 주어진 조건을 만족하는지 확인할 수 있다.
  7. min(), max(): 스트림에서 최솟값 또는 최댓값을 찾는다.
  8. findFirst(), findAny(): 스트림에서 첫번째 요소 또는 임의의 요소를 찾는다.
  9. peek(): 스트림의 각 요소를 확인하고 중간 결과를 확인하는 데 사용된다.

위의 스트림 메서드들의 예시이다.

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 5, 6, 7, 8, 9);

// 1. map(): 각 요소를 제곱
List<Integer> squaredNumbers = numbers.stream()
        .map(n -> n * n)
        .toList();
System.out.println("Squared numbers: " + squaredNumbers);
// Squared numbers: [1, 4, 9, 16, 25, 25, 36, 49, 64, 81]

// 2. flatMap(): 문자열 리스트를 하나로 합치기
List<String> words1 = Arrays.asList("Hello", "World");
List<String> words2 = Arrays.asList("Java", "Streams");
List<String> combinedWords = Arrays.stream(new List[]{words1, words2})
        .flatMap(List::stream)
        .toList();
System.out.println("Combined words: " + combinedWords);
// Combined words: [Hello, World, Java, Streams]

// 3. reduce(): 모든 요소의 합산
Optional<Integer> sum = numbers.stream()
        .reduce(Integer::sum);
System.out.println("Sum of numbers: " + sum.orElse(0));
// Sum of numbers: 50

// 4. distinct(): 중복된 요소 제거
List<Integer> distinctNumbers = numbers.stream()
        .distinct()
        .toList();
System.out.println("Distinct numbers: " + distinctNumbers);
// Distinct numbers: [1, 2, 3, 4, 5, 6, 7, 8, 9]

// 5. limit() 및 skip(): 처음 3개 요소 선택 후 2개 요소 건너뛰기
List<Integer> limitedAndSkipped = numbers.stream()
        .limit(3)
        .skip(2)
        .toList();
System.out.println("Limited and skipped: " + limitedAndSkipped);
// Limited and skipped: [3]

// 6. anyMatch(), allMatch(), noneMatch(): 조건 검사
boolean hasEven = numbers.stream().anyMatch(n -> n % 2 == 0);
boolean allEven = numbers.stream().allMatch(n -> n % 2 == 0);
boolean noneOdd = numbers.stream().noneMatch(n -> n % 2 != 0);
System.out.println("Has even number: " + hasEven);
System.out.println("All even numbers: " + allEven);
System.out.println("No odd numbers: " + noneOdd);
/* 
Has even number: true
All even numbers: false
No odd numbers: false 
*/

// 7. min() 및 max(): 최솟값과 최댓값 찾기
Optional<Integer> min = numbers.stream()
        .min(Integer::compare);
Optional<Integer> max = numbers.stream()
        .max(Integer::compare);
System.out.println("Min value: " + min.orElse(0));
System.out.println("Max value: " + max.orElse(0));
/* 
Min value: 1
Max value: 9
*/

// 8. findFirst() 및 findAny(): 첫 번째 요소와 임의의 요소 찾기
Optional<Integer> first = numbers.stream()
        .findFirst();
Optional<Integer> any = numbers.stream()
        .findAny();
System.out.println("First element: " + first.orElse(0));
System.out.println("Any element: " + any.orElse(0));
/* 
First element: 1
Any element: 1
*/

// 9. peek(): 각 요소 출력
numbers.stream()
        .peek(System.out::println)
        .count(); // peek()는 중간 작업이므로 최종 작업(count())가 필요합니다.
/*
1
2
3
4
5
5
6
7
8
9
*/
반응형

'JAVA' 카테고리의 다른 글

indexOf(), substring() 알고리즘  (0) 2024.05.20
대소문자 변환 알고리즘  (0) 2024.05.20
알고리즘 - 문자열  (0) 2024.05.20
getOrDefault 함수  (0) 2023.09.11