필터링
필터링은 중간 처리 기능으로 요소를 걸러내는 역할을 한다.
필터링 메소드인 distinct()와 filter() 메소드는 모든 스트림이 가지고 있는 공통 메소드
distinct() 메소드는 중복을 제거하는데
Stream의 경우 Object.equals(Object) 가 true 이면 동일한 객체로 판단하고 중복을 제거 한다 .
IntStream, LongStream, DoubleStream 은 동일값일 경우 중복을 제거 한다.
filter() 메소드는 매개값으로 주어진 Predicate가 true를 리턴하는 요소만 필터링 한다.
package Stream;
import java.util.Arrays;
import java.util.List;
public class FilteringExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("adam", "adam", "adam", "anna", "jack", "jenny");
names.stream().distinct().forEach(n -> System.out.println(n));
System.out.println("--------------------------------");
names.stream().filter(n -> n.startsWith("a")).forEach(n -> System.out.println(n));
System.out.println("--------------------------------");
names.stream().distinct().filter(predicate -> predicate.startsWith("a")).forEach(n -> System.out.println(n));
}
}
매핑(flatMapXXX(), mapXXX(), asXXXStream(), boxed())
매핑(mapping)은 중간 처리 기능으로 스트림의 요소를 다른 요소로 대체하는 작업
스트림에서 제공하는 매핑 메소드는 flatXXX(), mapXXX(), 그리고 asDoubleStream(), asLongStream(), boxed()
flatMapXXX() 메소드
flatMapXXX() 메소드는 요소를 대체하는 복수 개의 요소들로 구성된 새로운 스트림을 리턴한다.
스트림
A 라는 요소는 A1, A2 요소로 대체
B라는 요소는 B1, B2로 대체
A1,A2,B1,B2 요소를 가지는 새로운 스트림 생성
package Stream;
import java.util.Arrays;
import java.util.List;
public class FlatMapExample {
public static void main(String[] args) {
List<String> inputList1 = Arrays.asList("java 8", "java 9", "java 10");
inputList1.stream().flatMap(mapper -> Arrays.stream(mapper.split(" "))).forEach(System.out::println);
System.out.println("--------------------------------");
List<String> inputList2 = Arrays.asList("10, 20, 30", "40, 50, 60");
inputList2.stream().flatMapToInt(mapper -> {
String[] strArr = mapper.split(",");
int[] intArr = new int[strArr.length];
for (int i = 0; i < strArr.length; i++) {
intArr[i] = Integer.parseInt(strArr[i].trim());
}
return Arrays.stream(intArr);
}).forEach(System.out::println);
}
}
mapXXX() 메소드
mapXXX() 메소드는 요소를 대체하는 요소로 구성된 새로운 스트림은 리턴
스트림에서 A요소는 C요소로 대체, B요소는 D 요소로 대체 된다고 했을 경우
C, D요소를 가지는 새로운 스트림 생성
package Stream;
import java.util.Arrays;
import java.util.List;
public class MapExample {
public static void main(String[] args) {
List<Student> students = Arrays.asList(new Student("홍길동", 10), new Student("임꺽정", 20), new Student("유관순", 30));
students.stream().mapToInt(Student::getScore).forEach(System.out::println);
}
}
asDoubleStream(), asLongStream(), boxed() 메소드
asDoubleStream() 메소드는 IntStream의 int 요소 또는 LongStream 의 long요소를
double 요소로 타입 변환해서 DoubleStream 으로 생성한다.
asLongStream() 메소드는 IntStream의 int 요소로 타입 변환해서 LongStream을 생성한다.
boxed() 메소는 int,long,double 요소를 각각 Integer, Long, Double 요소로 박싱해서 Stream을 생성한다.
정렬(sorted())
스트림은 요소가 최종 처리되기 전에 중간 단계에서 요소를 정렬해서 최종 처리 순서를 변경할 수 있다.
요소를 정렬하는 메소드는 다음과 같다.
객체 요소 일 경우는 클래스가 Comparable 을 구현하지 않으면 sorted() 메소드를 호출했을때
ClassCastException 이 발생하기 때문에 Comparable 을 구현한 요소에서만 sorted() 메소드를 호출 해야 한다
package Stream;
public class Student implements Comparable<Student> {
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public int getScore() {
return score;
}
@Override
public int compareTo(Student o) {
// TODO Auto-generated method stub
return Integer.compare(score, o.getScore());
}
}
Student 요소를 오름차순으로 정렬하기 위해 Comparable 을 구현
객체 요소가 Comparaable 을 구현한 상태에서 기본 비교(Comparable) 방법으로 정렬하고 싶다면
sorted();
sorted((a,b) -> a.compareTo(b));
sorted(Comparator.naturalOrder());
기본 비교 방법과 정반대 방법으로 정렬하고 싶다면
sorted((a,b)->b.compareTo(a));
sorted(Comparator.reverseOrder());
객체 요소가 Comparable 를 구현하지 않았다면 Comparator를 매개값으로 갖는 sorted() 메소드를 사용하면 된다,
sorted((a,b) -> {...})
중괄호 {} 안에는 a와 b를 비교해서 a가 작으면 음수, 같으면 0, a가 크면 양수를 리턴하는 코드를 작성
package Stream;
import java.rmi.StubNotFoundException;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.IntStream;
public class SortingExample {
public static void main(String[] args) {
// 숫자 요소 일 경우
IntStream intStream = Arrays.stream(new int[] { 1, 2, 3, 4, 5 });
intStream.sorted().forEach(num -> System.out.println(num));
System.out.println("==================================================");
//객체 요소일 경우
List<Student> students = Arrays.asList(new Student("홍길동", 10), new Student("임꺽정", 20), new Student("유관순", 30));
students.stream().sorted().forEach(student -> System.out.println(student.getName() + " : " + student.getScore()));
students.stream().sorted(Comparator.reverseOrder()).forEach(student -> System.out.println(student.getName() + " : " + student.getScore()));
}
}
'Back-end > 이것이 자바다[신용권 한빛미디어]' 카테고리의 다른 글
기본 집계(sum(), count(), average(), max(), min()) (0) | 2022.06.03 |
---|---|
루핑(peek(), forEach()), 매칭 (allMatch(), anyMatch(), noneMatch()) (0) | 2022.06.02 |
스트림 파이프라인 (0) | 2022.05.28 |
스트림의 종류 (0) | 2022.05.28 |
스트림 소개 (0) | 2022.05.28 |