본문 바로가기
교육/Java

Java 개발자 수업 91일차 - 스트림(Stream)

by yhyuk 2021. 8. 7.
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
반응형

댓글