Java
[JAVA] Stream API
봉주니
2021. 2. 24. 18:10
Java Stream
Stream은 자바 8부터 추가된 기능으로 "컬렉션, 배열등의 저장 요소를 하나씩 참조하며 함수형 인터페이스(람다식)를 적용하며 반복적으로 처리할 수 있도록 해주는 기능"이다.
(InputStream, OutputStream같은 I/O Stream이 아니다.)
List<String> names = Arrays.asList("jeong", "pro", "jdk", "java");
// 기존의 코딩 방식
long count = 0;
for (String name : names) {
if (name.contains("o")) {
count++;
}
}
System.out.println("Count : " + count); // 2
// Iterator 방식
long count = 0;
Iterator<String> iter = names.iterator();
while(iter.hasNext()){
String name = iter.next();
if (name.contains("o")) {
count++;
}
}
System.out.println("Count : " + count); // 2
// 스트림 이용한 방식
count = 0;
count = names.stream().filter(x -> x.contains("o")).count();
System.out.println("Count : " + count); // 2
불필요한 코딩(for, if 문법)을 걷어낼 수 있고 직관적이기 때문에 가독성이 좋아진다.
Stream은 어떤 것들에 적용할 수 있을까?
Stream은 주로 Collection, Arrays에서 쓰인다.
물론 두 개 뿐만 아니라 I/O resources(ex. File), Generators, Stream ranges, Pattern 등에서도 사용할 수 있다.
해당 객체들로 부터 Stream을 생성하는 법은 스스로 찾아보도록 하고 기본적으로 자주 쓰이는 것들만 간단히 소개한다.
List<String> names = Arrays.asList("jeong", "pro", "jdk", "java");
names.stream(); //Collection에서 스트림 생성
Double[] dArray = {3.1, 3.2, 3.3};
Arrays.stream(dArray);//배열로 스트림 생성
Stream<Integer> str = Stream.of(1,2); // 스트림 직접 생성
배열에서의 스트림 활용
//String 배열
String[] strArray = { "홍길동", "이순신", "임꺽정"};
Stream<String> strStream = Arrays.stream(strArray);
strStream.forEach(a -> System.out.print(a + ","));
System.out.println();
//int 배열
int[] intArray = { 1, 2, 3, 4, 5 };
IntStream intStream = Arrays.stream(intArray);
intStream.forEach(a -> System.out.print(a + ","));
System.out.println();
클래스에서의 스트림 활용
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; }
}
public class FromCollectionExample {
public static void main(String[] args) {
List<Student> studentList = Arrays.asList(
new Student("홍길동", 10),
new Student("이순신", 20),
new Student("임꺽정", 30)
);
Stream<Student> stream = studentList.stream();
stream.forEach(s -> System.out.println("이름 : "+ s.getName()));
}
}
반응형