자바에서 Stream API를 사용하여 데이터 필터링하는 방법은?
_____A1: Stream API의 filter() 메서드를 사용합니다. filter()는 Predicate 인터페이스를 인자로 받아, 조건에 맞는 요소만 스트림에 남깁니다. 예시는 다음과 같습니다:
```java
List
List
.filter(s -> s.startsWith("a"))
.collect(Collectors.toList());
// 결과: ["apple"]
```
Q2: filter() 내부의 Predicate는 어떤 형태로 작성하나요?
A2: Predicate는 boolean을 반환하는 함수형 인터페이스로, 람다식으로 작성합니다. 예를 들어, 숫자 리스트에서 짝수만 필터링하려면:
```java
List
List
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
// 결과: [2, 4]
```
Q3: 스트림에서 여러 조건을 조합해 필터링하려면 어떻게 하나요?
A3: filter()를 여러 번 호출하거나, Predicate의 and, or, negate 메서드를 조합해 작성합니다. 예:
```java
List
List
.filter(s -> s.startsWith("a"))
.filter(s -> s.length() > 5)
.collect(Collectors.toList());
// 결과: ["avocado"]
// 또는 Predicate 조합
Predicate
Predicate
List
.filter(startsWithA.and(lengthGt5))
.collect(Collectors.toList());
```
Q4: 필터링 후 결과를 컬렉션으로 받으려면 어떻게 해야 하나요?
A4: collect(Collectors.toList()) 또는 toSet() 등 수집기를 사용해 스트림 결과를 컬렉션으로 변환합니다.
예:
```java
List
Set
```
Q5: 필터링된 데이터가 없어도 안전하게 처리하는 방법은?
A5: 필터링 후 결과 컬렉션을 Optional로 감싸거나, 기본값을 제공해야 할 경우 Default 값을 따로 지정하는 방식을 활용합니다. 보통은 빈 리스트로 처리합니다. 예:
```java
List
.filter(s -> s.length() > 10)
.collect(Collectors.toList());
if(filtered.isEmpty()) {
System.out.println("조건에 맞는 데이터가 없습니다.");
}
```
Q6: 숫자 범위로 필터링하려면?
A6: filter()에 범위 조건을 추가하면 됩니다.
```java
List
List
.filter(n -> n >= 15 && n <= 25)
.collect(Collectors.toList());
// 결과: [15, 20, 25]
```
Q7: null 값을 포함하는 리스트 필터링 시 주의할 점은?
A7: filter() 안에서 null 체크를 반드시 해야 합니다. 그렇지 않으면 NullPointerException이 발생합니다.
예:
```java
List
List
.filter(Objects::nonNull)
.filter(s -> s.startsWith("a"))
.collect(Collectors.toList());
// 결과: ["apple"]
```
Q8: map과 filter를 함께 쓰는 예는?
A8: map으로 데이터를 변환하고 filter로 조건을 걸 수 있습니다.
```java
List
List
.map(String::toUpperCase)
.filter(s -> s.startsWith("A"))
.collect(Collectors.toList());
// 결과: ["APPLE"]
```
위와 같이 Stream API의 filter() 메서드를 활용하면 간결하고 효율적으로 데이터를 조건 기반으로 필터링할 수 있습니다.
Stream API를 사용하면 데이터 필터링, 매핑, 정렬, 집계 등의 작업을 간결하고 효율적으로 수행할 수 있습니다.
이 글에서는 Stream API를 사용하여 데이터 필터링하는 방법에 대해 자세히 설명하겠습니다.
1. Stream API의 기본 개념Stream은 데이터 소스(컬렉션, 배열 등)에서 파생된 일련의 요소를 처리할 수 있는 시퀀스입니다.
Stream은 다음과 같은 특징을 가지고 있습니다:- 지연 평가(Lazy Evaluation) : Stream의 연산은 최종 연산이 호출될 때까지 실행되지 않습니다.
- 중간 연산과 최종 연산 : 중간 연산(예: `filter`, `map`)은 Stream을 반환하며, 최종 연산(예: `collect`, `forEach`)은 결과를 생성합니다.
- 파이프라인 : 여러 개의 중간 연산을 연결하여 하나의 처리 파이프라인을 구성할 수 있습니다.
2. 데이터 필터링의 기본 사용법데이터 필터링은 주어진 조건에 맞는 요소만을 선택하는 작업입니다.
Stream API에서는 `filter` 메서드를 사용하여 데이터를 필터링할 수 있습니다.
`filter` 메서드는 Predicate를 인자로 받아, 조건을 만족하는 요소만 포함된 새로운 Stream을 반환합니다.
예제: 리스트에서 짝수만 필터링하기```javaimport java.util.Arrays;import java.util.List;import java.util.stream.Collectors;public class StreamFilterExample { public static void main(String[] args) { List
10); List
조건을 만족하는 요소만 포함된 새로운 Stream이 생성되고, `collect` 메서드를 통해 결과를 리스트로 변환합니다.
3. 복잡한 필터링 조건필터링 조건은 단순한 경우뿐만 아니라 복잡한 경우에도 적용할 수 있습니다.
여러 조건을 조합하여 사용할 수 있으며, `and`, `or`, `negate` 메서드를 통해 Predicate를 조합할 수 있습니다.
예제: 특정 조건을 만족하는 객체 필터링```javaimport 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; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + '}'; }}public class StreamFilterComplexExample { public static void main(String[] args) { List
5), new Person("Charlie", 3
5), new Person("David", 20) ); List
5) // 나이가 25세 이상인 사람 .filter(p -> p.getName().startsWith("A")) // 이름이 'A'로 시작하는 사람 .collect(Collectors.toList()); System.out.println(filteredPeople); // [Person{name='Alice', age=30}] }}```위의 예제에서는 `Person` 객체의 리스트에서 나이가 25세 이상이고 이름이 'A'로 시작하는 사람들을 필터링합니다.
여러 개의 `filter` 메서드를 체이닝하여 복잡한 조건을 쉽게 구현할 수 있습니다.
4. 최종 연산필터링된 결과를 얻은 후, 최종 연산을 통해 결과를 수집하거나 출력할 수 있습니다.
`collect` 외에도 `forEach`, `count`, `anyMatch`, `allMatch`, `noneMatch` 등의 다양한 최종 연산을 사용할 수 있습니다.
예제: 필터링된 결과의 개수 세기```javalong count = people.stream() .filter(p -> p.getAge() > 2
5) .count(); // 조건을 만족하는 사람의 수System.out.println("Number of people older than 25: " + count); // 2```
5.Java의 Stream API를 사용하면 데이터 필터링을 간결하고 효율적으로 수행할 수 있습니다.
`filter` 메서드를 통해 조건에 맞는 요소를 선택하고, 다양한 최종 연산을 통해 결과를 처리할 수 있습니다.
이러한 기능들은 코드의 가독성을 높이고, 복잡한 데이터 처리 작업을 쉽게 수행할 수 있도록 도와줍니다.
Stream API를 활용하여 데이터 필터링을 포함한 다양한 데이터 처리 작업을 수행해 보시기 바랍니다.
작성자:
김주아 [비회원]
| 작성일자: 1년 전
2024-09-05 03:56:59
조회수: 254 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 254 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.