728x90
반응형
2022.06.08
96번째 포스팅
프로젝트를 진행하다보면 난생 처음보는 메소드와 객체를 볼때가 있다.
일반적으로는 운영을 위해 쉽고 누구나 아는 메소드와 객체를 사용해서 개발을 진행한다.
하지만 프로젝트중에도 공부를 하는 개발자들은 자신이 새로 알게 된 지식들을 프로젝트에 적용한다.
오늘은 나의 바로 옆자리에서 같이 응용개발을 진행한 대리님이 사용한 Stream에 대해서 적어보려고 한다.
0. Stream
① Iterator와 같은 외부반복자를 사용하지 않아도 데이터에 접근할 수 있다. (내부 반복자를 사용)
② 1회용이다. 한번 사용하면 close되어 다시 사용할 수 없다.
③ parallelStream() 메소드를 사용하여 손쉽게 병렬처리가 가능하다.
④ 람다식으로 표현하기 때문에 가독성이 좋다.
⑤ 출처: Baeldung
1. 구조
① 구조
② BaseStream 인터페이스를 구현한 인터페이스
③ Stream에 구현된 메소드들은 ReferencePipeline 클래스에서 확인할 수 있다.
2. filter()
① 조건에 만족하는 모든 요소를 찾고 필터링된 요소만 포함하는 새로운 스트림을 생성한다.
② 람다식을 사용
3. 예시코드
① Input 혹은 Select Query 결과값 만들기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
public class Stream01 {
static class Student {
private int number;
private String className;
private String name;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static List<Student> init() {
List<Student> output = new ArrayList<>();
Student instance = new Student();
instance.setNumber(1);
instance.setClassName("A");
instance.setName("윤종신");
output.add(instance);
instance = new Student();
instance.setNumber(2);
instance.setClassName("B");
instance.setName("유희열");
output.add(instance);
instance = new Student();
instance.setNumber(3);
instance.setClassName("B");
instance.setName("성시경");
output.add(instance);
instance = new Student();
instance.setNumber(4);
instance.setClassName("A");
instance.setName("정준일");
output.add(instance);
instance = new Student();
instance.setNumber(5);
instance.setClassName("B");
instance.setName("규현");
output.add(instance);
return output;
}
}
|
cs |
② 스트림 생성 및 데이터 가공
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
package day01;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class Stream01 {
public static void main(String[] args) {
// 1. Select Query 결과
List<Student> input = init();
System.out.println("==============================");
System.out.println("input으로 받은 데이터");
for (Student list : input) {
System.out.print(list.getNumber());
System.out.print(" " + list.getClassName());
System.out.print(" " + list.getName() + "\n");
}
System.out.println("==============================\n");
System.out.println("==============================");
System.out.println("filter와 forEach를 람다식으로 표현");
// 2. 스트림 생성
Stream<Student> stream01 = input.stream();
// 2-1. 병렬처리 스트림 생성
Stream<Student> stream02 = input.parallelStream();
// 3. filter() 메소드를 사용하여 필요한 값들만 SELECT
// 4. forEach() 메소드를 사용하여 필터링된 값들을 출력
stream01.filter(s -> "B".equals(s.getClassName()))
.forEach(s -> System.out.println(s.getName()));
System.out.println("==============================");
}
}
|
cs |
③ 전체코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
package day01;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class Stream01 {
static class Student {
private int number;
private String className;
private String name;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static List<Student> init() {
List<Student> output = new ArrayList<>();
Student instance = new Student();
instance.setNumber(1);
instance.setClassName("A");
instance.setName("윤종신");
output.add(instance);
instance = new Student();
instance.setNumber(2);
instance.setClassName("B");
instance.setName("유희열");
output.add(instance);
instance = new Student();
instance.setNumber(3);
instance.setClassName("B");
instance.setName("성시경");
output.add(instance);
instance = new Student();
instance.setNumber(4);
instance.setClassName("A");
instance.setName("정준일");
output.add(instance);
instance = new Student();
instance.setNumber(5);
instance.setClassName("B");
instance.setName("규현");
output.add(instance);
return output;
}
public static void main(String[] args) {
// 1. Select Query 결과
List<Student> input = init();
System.out.println("==============================");
System.out.println("input으로 받은 데이터");
for (Student list : input) {
System.out.print(list.getNumber());
System.out.print(" " + list.getClassName());
System.out.print(" " + list.getName() + "\n");
}
System.out.println("==============================\n");
System.out.println("==============================");
System.out.println("filter와 forEach를 람다식으로 표현");
// 2. 스트림 생성
Stream<Student> stream01 = input.stream();
// 2-1. 병렬처리 스트림 생성
Stream<Student> stream02 = input.parallelStream();
// 3. filter() 메소드를 사용하여 필요한 값들만 SELECT
// 4. forEach() 메소드를 사용하여 필터링된 값들을 출력
stream01.filter(s -> "B".equals(s.getClassName()))
.forEach(s -> System.out.println(s.getName()));
System.out.println("==============================");
}
}
|
cs |
728x90
반응형
'백엔드 > 자바' 카테고리의 다른 글
[BE/JAVA] Reflection 개발방법 개념 및 샘플코드 (0) | 2023.05.02 |
---|---|
[BE/JAVA] Stream.anyMatch().allMatch() (0) | 2023.04.23 |
[BE/JAVA] 소켓통신 (예제코드 포함) (0) | 2022.02.02 |
[BE/JAVA] HashMap clear() vs new HashMap<>() (0) | 2021.12.26 |
[BE/JAVA] JSP에서 엑셀파일 읽어서 DB에 저장하기 - 3 (0) | 2021.07.03 |
댓글