반응형
여러가지 자바의 스트림 메소드를 알아보도록 하겠다.
일단 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' 메서드를 사용하여 결과를 리스트로 수집하고 결과를 출력한다.
이외에도 여러가지 다양한 스트림 메서드를 살펴보겠다.
- map(): 스트림의 각 요소를 특정 함수를 사용하여 변환한다. 예를 들어, 리스트의 모든 요소를 제곱하거나 문자열을 대문자로 바꿀 수 있다.
- flatMap(): 스트림의 각 요소를 다른 스트림으로 변환한 다음 이를 하나로 합친다. 이것은 중첩된 컬렉션의 요소를 평탄화하거나 매핑된 요소를 병합하는 데 유용하다.
- reduce(): 스트림의 요소를 이용하여 값을 하나로 줄인다. 예를 들어, 모든 요소를 합산하거나 최댓값을 찾는 데 사용할 수 있다.
- distinct(): 스트림에서 중복된 요소를 제거한다.
- limit() 및 skip(): limit(n)은 스트림에서 처음 n개의 요소만을 포함하고, skip(n)은 처음 n개의 요소를 건너뛴 나머지 요소만을 포함한다.
- anyMatch(), allMatch(), noneMatch(): 스트림의 요소 중 일부나 모두가 주어진 조건을 만족하는지 확인할 수 있다.
- min(), max(): 스트림에서 최솟값 또는 최댓값을 찾는다.
- findFirst(), findAny(): 스트림에서 첫번째 요소 또는 임의의 요소를 찾는다.
- 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 |