728x90
반응형
스트림(Stream)
스트림(Stream)
- 자바의 스트림에는 대표적인 2가지 스트림이 있는데, 입출력 스트림과, Java 8(JDK1.8)에서 제공하는 스트림이다.
1) 입출력 스트림: 파일 입출력, 콘솔 입출력, 네트워크 입출력
2) 스트림: Java 8(JDK1.8), 배열/컬렉션의 탐색을 지원, 람다식 사용
[ 스트림 얻어오기 ]
1) 순수 배열
2) 컬렉션
3) 숫자범위
4) 파일
5) 디렉토리(폴더)
[ 예제1 - 순수 배열/컬렉션으로부터 스트림 얻어오기 ]
- for문 vs 향상된 for문 vs iterator vs 스트림
// 순수배열
int[] nums = { 1, 8, 2, 3, 5, 9, 6, 4, 7 };
// 컬렉션 ArrayList
ArrayList<Integer> nums2 = new ArrayList<Integer>();
// 1. for문으로 탐색
for (int i=0; i<nums.length; i++) {
System.out.printf("%4d", nums[i]);
nums2.add(nums[i]);
}
// 2. 향상된 for문 탐색
for (int n : nums) {
System.out.printf("%4d", n);
}
// 3. iterator 탐색
Iterator<Integer> iter = nums2.iterator();
while (iter.hasNext()) {
System.out.printf("%4d", iter.next());
}
// 4. Stream 탐색
// - stream() 메소드 제공 > Stream 탐색 가능
// - 컬렉션.stream() > Arrays.stream(배열)
// - 함수 지향형 프로그램
Consumer<Integer> c1 = n -> System.out.printf("%4d", n);
nums2.stream().forEach(c1);
--> for문 Output
1 8 2 3 5 9 6 4 7
--> 향상된 for문 Output
1 8 2 3 5 9 6 4 7
--> iterator Output
1 8 2 3 5 9 6 4 7
--> Stream Output
1 8 2 3 5 9 6 4 7
[ 예제2 - 컬렉션으로부터 스트림 얻어오기 ]
- 이름이 3글자 이상과 그 미만을 Stream으로 구하기
List<String> names = new ArrayList<String>();
names.add("홍길동");
names.add("홍길동동동");
names.add("길동");
names.add("홍");
names.add("홍동동동동오동도오동길동");
// stream.forEach(람다식)
names.stream().forEach(name -> {
if (name.length() >= 3) {
System.out.println("긴이름: " + name);
} else {
System.out.println("짧은이름: " + name);
}
});
--> Output
긴이름: 홍길동
긴이름: 홍길동동동
짧은이름: 길동
짧은이름: 홍
긴이름: 홍동동동동오동도오동길동
[ 예제3 - 숫자 범위로부터 스트림 얻어오기 ]
IntStream list1 = IntStream.range(1, 11);
list1.forEach(n -> System.out.printf("%4d", n));
--> Output
1 2 3 4 5 6 7 8 9 10
[ 예제4 - 파일로부터 스트림 얻어오기 ]
- BufferedReadaer vs Files (Stream)
- data폴더 > data.txt
try {
// 방법1. 기존 BufferedReader 방식
BufferedReader reader = new BufferedReader(new FileReader(".\\data\\data.txt"));
String line = "";
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
System.out.println();
// 방법2. 스트림 방식
Files.lines(Paths.get(".\\data\\data.txt")).forEach(ln -> System.out.println(ln));
System.out.println();
} catch (Exception e) {
e.printStackTrace();
}
--> BufferedReader Output
data.txt 내용....
--> 스트림 Output
data.txt 내용....
[ 예제 5 - 디렉토리로부터 스트림 얻어오기 ]
try {
Path workspace = Paths.get("D:\\class\\server"); // 현재폴더
Files.list(workspace).forEach(path -> System.out.println(path.toString())); //Stream<Path>
} catch (Exception e) {
e.printStackTrace();
}
--> Output
server 하위 폴더목록
D:\class\server\.gitignore
D:\class\server\.metadata
D:\class\server\EtcTest
D:\class\server\JSPTest
D:\class\server\myapp
D:\class\server\rural
D:\class\server\Servers
D:\class\server\ServletTest
MEMO>
# 스트림을 배우면서 코드가 살짝 난해하면서 헷갈려 보이지만 그 이유는 이전에 배우고 있었던,
객체지향 프로그래밍 방식 -> 함수형 프로그래밍 방식으로 변했기 때문에 낯설어서 그렇다!!
# 기존에 알고있던 for문, 향상된for문, 파일읽기, 폴더읽기 등 알고 있던 방식과 오늘 배운 스트림 얻어오는 방식을 잘 구분해서 사용하자!
# 스트림 얻어올때는 순수배열, 컬렉션, 숫자범위, 파일, 폴더 이 5가지에서 유용하게 사용할 수 있다.
728x90
반응형
'교육 > Java' 카테고리의 다른 글
Java 개발자 수업 93일차 - 팀 프로젝트로 인한 수업X (0) | 2021.08.07 |
---|---|
Java 개발자 수업 92일차 - 파이프 라인(Pipe Line) (0) | 2021.08.07 |
Java 개발자 수업 90일차 - Function, Operation, Predicate, 함수 조합용 메소드 (0) | 2021.08.07 |
Java 개발자 수업 89일차 - 함수형 인터페이스(Functional Interface), Consumer, Supplier (0) | 2021.08.07 |
Java 개발자 수업 88일차 - 람다식 (Lambda Expression) (0) | 2021.07.31 |
댓글