3. 중간처리
1) 중복제거: distinct()
2) 필터링 : filter(Predicate)
3) 가공 : map(Function), mapToInt(ToIntFunction)
==> 한개 파라미터 입력되면 한개의 리턴값이 반환
: flatMap(Function) : Stream
==> 한개 파라미터 입력되면 여러개가 하나에 저장되어 반환.
// 하나의 파라미터로 복수개의 요소들로 구성된 새로운 Stream을 반환한다.
flatMap(Function<? super T , ? extends Stream<? extends R>> mapper)
예> 입력: "a/b/c"
리턴: [a,b,c] 형태의 Stream 반환됨.
: 반환값이 정수라면 flatMapToInt(Function<? super T,? extends IntStream> mapper)
4) 정렬 :
a. 배열: Arrays.sort(배열);// 오름차순
Arrays.sort(배열, Comparator);// 내림차순
b. 컬렉션: Collections.sort(컬렉션, Comparator) // 오름차순,내림차순
c. Stream: sorted()
sorted(Comparator)
sorted(Comparator.comparing(t->t.getEng()) // 권장, 기본은 오름차순
sorted(Comparator.comparing(t->t.getEng(), Comparator.reverseOrder()) // 내림차순
5) 갯수 제한 및 skip
- limit(n)
- skip(n)
=======> 중간처리는 처리후 거의 대부분이 Stream으로 반환됨.
package exam24_스트림;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class StreamTest02_중간처리1_중복제거_필터링 {
public static void main(String[] args) {
List<String> list = Arrays.asList("홍길동","이순신","유관순","이순신","태조","태종");
// 1. 중복제거
list.stream()
.distinct()
.forEach(System.out::println); // 홍길동 이순신 유관순
System.out.println();
// 2. 필터링: filter(Predicate<? super T> predicate)
// 첫글자가 "이"로 시작
Predicate<String> x = new Predicate<String>() {
@Override
public boolean test(String t) {
return t.startsWith("이");
}
};
list.stream().filter(x).forEach(System.out::println);;
System.out.println();
list.stream()
.filter(t -> t.startsWith("이"))
.forEach(System.out::println);
System.out.println();
// 3. distict() + filter()
list.stream()
.distinct()
.filter(t -> t.startsWith("이"))
.forEach(System.out::println);
System.out.println();
// 실습: 이름이 2글자만 출력
list.stream()
.filter(t -> t.length() == 2).
forEach(System.out::println);
}// end main
}
package exam24_스트림;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.function.ToIntFunction;
class Student {
String name;
int kor; // 국어점수
int eng; // 영어점수
public Student() {}
public Student(String name, int kor, int eng) {
this.name = name;
this.kor = kor;
this.eng = eng;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
@Override
public String toString() {
return "Student [name=" + name + ", kor=" + kor + ", eng=" + eng + "]";
}
}// end Student class
public class StreamTest02_중간처리2_가공_map {
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
list.add(new Student("홍길동", 100, 80));
list.add(new Student("이순신", 89, 90));
list.add(new Student("유관순", 99, 99));
// 1. 이름에서 첫글자만 출력 (성만 출력)-----------------------------------------------
Function<Student, String> f = new Function<Student, String>() {
@Override
public String apply(Student t) {
return t.getName().substring(0,1);
}
};
list.stream().map(f).forEach(System.out::println);;
System.out.println();
list.stream().map(t->t.getName().substring(0,1)).forEach(System.out::println);;
System.out.println();
// 2. eng 점수에 -5 해서 출력------------------------------------------------------
Function<Student, Integer> f2 = new Function<Student, Integer>() {
@Override
public Integer apply(Student t) {
return t.getEng() - 5;
}
};
list.stream().map(f2).forEach(System.out::println);
list.stream().map(t -> t.getEng()-5).forEach(System.out::println);
System.out.println();
//------
ToIntFunction<Student> f3 = new ToIntFunction<Student>() {
@Override
public int applyAsInt(Student t) {
return t.getEng() - 5;
}
};
list.stream().mapToInt(f3).forEach(System.out::println);
list.stream().mapToInt(t->t.getEng()-5).forEach(System.out::println);
}// end main
}
package exam24_스트림;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Stream;
public class StreamTest02_중간처리2_가공2_flatMap {
public static void main(String[] args) {
List<String> list = Arrays.asList("홍길동/홍길동2","이순신/이순신2");
// " A / A' " 형태라면 / 기준으로 A, A' 나눈다.
// 하나의 파라미터로 복수개의 요소들로 구성된 새로운 Stream 을 반환한다.
// flatMap(Function< ? super T , ? extends Stream<? extends R> > mapper )
Function<String, Stream<? extends String>> f = new Function<String, Stream<? extends String>>() {
@Override
public Stream<? extends String> apply(String t) {
String [] names = t.split("/");
return Arrays.stream(names);
}
};
list.stream().flatMap(f).forEach(System.out::println);
}// end main
}
package exam24_스트림;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.function.Function;
class Student2 {
String name;
int kor; // 국어점수
int eng; // 영어점수
public Student2() {}
public Student2(String name, int kor, int eng) {
this.name = name;
this.kor = kor;
this.eng = eng;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
@Override
public String toString() {
return "Student [name=" + name + ", kor=" + kor + ", eng=" + eng + "]";
}
}// end Student class
public class StreamTest02_중간처리3_정렬_sorted {
public static void main(String[] args) {
List<Student2> list = new ArrayList<>();
list.add( new Student2("홍길동", 100,80));
list.add( new Student2("이순신", 89,90));
list.add( new Student2("유관순", 99,65));
list.add( new Student2("유관순", 99,34));
list.add( new Student2("유관순", 99,100));
// eng 로 정렬
Comparator<Student2> c = new Comparator<Student2>() {
@Override
public int compare(Student2 s1, Student2 s2) {
// return s1.getEng() - s2.getEng(); // 오름차순
return s2.getEng() - s1.getEng(); // 내림차순
}
};
list.stream().sorted(c).forEach(System.out::println);
System.out.println();
// 람다
Comparator<Student2> c2 = (s1, s2) -> s2.getEng() - s1.getEng();
list.stream().sorted((s1, s2) -> s2.getEng() - s1.getEng()).forEach(System.out::println);
System.out.println();
// 추가: Comparator.comparing(Function)
Function<Student2, Integer> f = new Function<Student2, Integer>() {
@Override
public Integer apply(Student2 t) {
return t.getEng();
}
};
System.out.println("오름차순");
list.stream().sorted(Comparator.comparing(f)).forEach(System.out::println); // 오름차순
System.out.println();
// 람다 - 오름차순
list.stream().sorted(Comparator.comparing(t -> t.getEng())).forEach(System.out::println);
// 람다식 풀어서 확인
list.stream().sorted(Comparator.comparing((Student2 t) -> t.getEng())).forEach(System.out::println);
// 축약
list.stream().sorted(Comparator.comparing(Student2::getEng)).forEach(System.out::println); // ( * )
System.out.println();
// 내림차순: .sorted(Comparator.comparing( f, Comparator.reverseOrder() ))
System.out.println("내림차순");
list.stream().sorted(Comparator.comparing(f, Comparator.reverseOrder())).forEach(System.out::println);
}// end main
}
package exam24_스트림;
import java.util.ArrayList;
import java.util.List;
class Student3 {
String name;
int kor; // 국어점수
int eng; // 영어점수
public Student3() {}
public Student3(String name, int kor, int eng) {
this.name = name;
this.kor = kor;
this.eng = eng;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
@Override
public String toString() {
return "Student [name=" + name + ", kor=" + kor + ", eng=" + eng + "]";
}
}// end Student class
public class StreamTest02_중간처리4_limit_skip {
public static void main(String[] args) {
List<Student3> list = new ArrayList<>();
list.add( new Student3("홍길동", 100,80));
list.add( new Student3("이순신", 89,90));
list.add( new Student3("유관순1", 99,65));
list.add( new Student3("유관순2", 99,34));
list.add( new Student3("유관순3", 99,100));
// 3개만 출력
list.stream().limit(2).forEach(System.out::println);
System.out.println();
// skip(n)
list.stream().skip(2).forEach(System.out::println);
}// end main
}
'[study]이론정리 > JAVA(eclipse)' 카테고리의 다른 글
java 14 일차 _ 04. 스트림(최종처리) (0) | 2024.03.27 |
---|---|
java 14 일차 _ 02. 스트림 (0) | 2024.03.27 |
java 14 일차 _ 01. 메서드참조 (0) | 2024.03.27 |
java 13일차 _ 01. 제네릭스( generics ) / 컬렉션 API / 표준API함수형인터페이스 (0) | 2024.03.26 |
java 13 일차 _ 12일차 정리 (0) | 2024.03.26 |