안녕하세요 알통몬입니다. 공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^ |
스트림의 특징2017/03/30 - [자바] - 자바 스트림 Java Stream => 스트림의 특징
java.util.Stream 패키지에 스트림 API 들이 있습니다.
BaseStream을 부모로 하여 자식 인터페이스들이 상속 관계를 이루고 있습니다.
BaseStream에는 공통적으로 사용되는 메소드들이 정의만 되어있고 직접 사용되지는 않습니다.
하위 스트림인 Stream, IntStream, DoubleStream, LongStream이 직접적으로 이용됩니다.
Stream은 객체 요소를 처리하는 스트림이고,
나머지 스트림들은 가각 기본 타입인 int, long, double 요소를 처리하는 스트림입니다.
스트림 인터페이스의 구현 객체는 다양한 소스로부터 얻을 수 있는데,
주로 컬렉션에서 얻고, 아래 표의 소스로부터 스트림 구현 객체를 얻을 수도 있습니다.
1. 컬렉션으로부터 스트림을 얻기
예제)
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class FromCollectionExample {
public static void main(String[] args) {
List<Student> studentList = Arrays.asList(
new Student("티스토리", 100),
new Student("블로그", 200),
new Student("알통몬", 300)
);
Stream<Student> stream = studentList.stream();
stream.forEach(s -> System.out.println(s.getName()));
}
}
학생 클래스)
public class Student {
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() { return name; }
public int getScore() { return score; }
}
2. 배열로부터 스트림을 얻기
예제)
import java.util.Arrays;
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class FromArrayExample {
public static void main(String[] args) {
String[] strArray = { "티스토리", "블로그", "알통몬"};
Stream<String> strStream = Arrays.stream(strArray);
strStream.forEach(a -> System.out.print(a + ","));
System.out.println();
int[] intArray = { 10, 20, 30, 40, 50 };
IntStream intStream = Arrays.stream(intArray);
intStream.forEach(a -> System.out.print(a + ","));
System.out.println();
}
}
3. 숫자 범위로부터 스트림을 얻기
rangeClose()는 첫 번째 매개 값부터 두 번째 매개 값까지 순차적으로 제공하는
IntStream을 리턴합니다. 또 다른 메소드인 range()도 동일한 스트림을 리턴하지만
두 번째 매개 값을 포함하지 않습니다.
예제)
import java.util.stream.IntStream;
public class FromIntRangeExample {
public static int sum;
public static int sum2;
public static void main(String[] args) {
IntStream stream = IntStream.rangeClosed(1, 10);
stream.forEach(a -> sum += a);
System.out.println("1부터 10까지의 총합: " + sum);
IntStream stream2 = IntStream.range(1, 10);
stream2.forEach(b -> sum2 += b);
System.out.println("1부터 9까지의 총합: " + sum2);
}
}
4. 파일로부터 스트림을 얻기
Files의 정적 메소드인 lines()와 BufferedReader의 lines()를 이용해 문자 파일의 내용을 스트림을 통하여
행 단위로 읽고 콘솔에 출력하는 예제를 보겠습니다.
먼저 lineText.txt 파일을 만듭니다.
내용)
1. 람다식
2. 메소드 참조
3. 디폴트 메소드와 정적 메소드
4. 새로운 API 패키지
예제)
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class Example {
public static void main(String[] args) throws IOException {
Path path = Paths.get("C:/apache-tomcat-8.0.20/webapps/thisisjava/src/linedata.txt");
Stream<String> stream;
//Files.lines() 이용
stream = Files.lines(path, Charset.defaultCharset());
stream.forEach( System.out :: println );
stream.close();
System.out.println();
//BufferedReader의 lines() 이용
File file = path.toFile();
FileReader fileReader = new FileReader(file);
BufferedReader br = new BufferedReader(fileReader);
stream = br.lines();
stream.forEach( System.out :: println );
stream.close();
}
}
4. 디렉토리로부터 스트림을 얻기
Files의 list()를 통해 디렉토리의 내용을 스트림을 통해 읽고 콘솔에 출력하는 예제입니다.
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class FromDirectoryExample {
public static void main(String[] args) throws IOException {
Path path = Paths.get("C:/Users/알통몬/Desktop/thisisjava");
Stream<Path> stream = Files.list(path);
stream.forEach( p -> System.out.println(p.getFileName()) );
}
}
이상입니다.
다음 포스팅에서는 스트림 파이프라인에 대해 공부하겠습니다.