가자미의 개발이야기
[자바] 스트림 활용 메소드 본문
1. 스트림 생성과 연결
-스트림을 생성과 동시에 원소를 전달하는 of
-static <T> Stream<T> of(T....values)
--double, int, long 형 스트림에도 오버로딩 되어 있음.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class StreamPtc {
public static void main(String[] args) {
Stream.of(11,22,33,44)//4개의 값으로 스트림 생성(원소 4개)
.forEach(n->System.out.print(n+"\t"));
System.out.println();
Stream.of("So simple!")//하나의 String인스턴스로 스트림 생성(원소 1개)
.forEach(s->System.out.print(s+"\t"));
System.out.println();
List<String> s1 = Arrays.asList("Toy", "Robot", "Box");
Stream.of(s1)//하나의 컬렉션 인스턴스로 스트림 생성(원소 1개)
.forEach(w->System.out.print(w+"\t"));
System.out.println();
}
}
|
cs |
-스트림 원소의 범위를 지정하는 range
-static IntStream range(int start, int end) //LongStream도 가능
-일반 스트림을 병렬 스트림으로 바꾸는 parallel()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import java.util.Arrays;
import java.util.List;
import java.util.function.BinaryOperator;
import java.util.stream.Stream;
public class StreamPtc {
public static void main(String[] args) {
List<String> ls = Arrays.asList("Toy", "Robot", "Box");
Stream<String> ss = ls.stream(); //스트림 생성.
BinaryOperator<String> lc = (s1, s2)->{
if(s1.length()>s2.length())
return s1;
else
return s2;
};
String str = ss.parallel()//병렬 스트림 생성
.reduce("",lc);
System.out.println(str);
}
}
|
cs |
-스트림을 연결해주는 concat(Stream<T> s1, Stream<T> s2)
2. 스트림 중간연산
- 하나의 입력값으로 여러가지 반환값을 매핑하는 flatmap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import java.util.Arrays;
import java.util.List;
import java.util.function.BinaryOperator;
import java.util.stream.Stream;
public class StreamPtc {
public static void main(String[] args) {
Stream<String> ss1 = Stream.of("My_Age", "Your_Life");
Stream<String> ss2 = ss1.//람다식에서 스트림을 생성
flatMap(s->Arrays.stream(s.split("_")));
ss2.forEach(s->System.out.print(s+"\t"));
System.out.println();
}
}
|
cs |
-정렬하는 sotred
-Comparable<T>인터페이스를 구현한 인스턴스 대상 .sorted()
-compareTo 메소드에 대상 .sorted((s1, s2)->기준정의)
-스트림 원소 하나마다 수행하는 루핑(peek이 대표적)
-peek은 forEach와 기능은 동일하다
-그러나 peek은 중간연산, forEach는 최종연산이다.
-중간 연산은 최종 연산이 없으면 수행하지 않는다.
3. 최종 연산
-sum, count는 기본 자료형으로 반환
-average, min, max는 Optional 인스턴스로 반환
-forEach : 원소 하나마다 행동 수행.
-원소들이 조건에 맞는지에 따라 T/F 반환하는
-allMatch, anyMatch, noneMatch
-람다로 조건 작성
-스트림의 결과물을 따로 저장하는 collect
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class StreamPtc {
public static void main(String[] args) {
String[] words = {"Hello","Box", "Robot", "Toy"};
Stream<String> ss = Arrays.stream(words);
List<String> ls = ss.filter(s->s.length()<5)
.collect(()->new ArrayList<>(),//저장소 생성
(c, s)-> c.add(s),// 저장소 인스턴스 c, 스트림 데이터 s
(lst1, lst2)-> lst1.addAll(lst2));//순차스트림에선 의미 x
}
}
|
cs |
병렬의 경우
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class StreamPtc {
public static void main(String[] args) {
String[] words = {"Hello","Box", "Robot", "Toy"};
Stream<String> ss = Arrays.stream(words);
List<String> ls = ss.parallel()//병렬
.filter(s->s.length()<5)
.collect(()->new ArrayList<>(),//저장소 생성
(c, s)-> c.add(s),// 저장소 인스턴스 c, 스트림 데이터 s
(lst1, lst2)-> lst1.addAll(lst2));//나눠졌던 인스턴스를 한 곳에 모음
}
}
|
cs |
'Java > 자바 기본 문법' 카테고리의 다른 글
[자바] I/O 스트림 (0) | 2021.02.26 |
---|---|
[자바] 시각과 날짜 관련 코드 (0) | 2021.02.19 |
자바 스트림의 기초 (0) | 2021.02.09 |
자바 Optional 클래스 (0) | 2021.02.09 |
자바 메소드 참조 (0) | 2021.02.09 |