자바 스트림이란 What is Stream in JAVA?
스트림(Stream) 개념
스트림(Stream)은 JAVA 8부터 추가된 기능이다. 컬렉션의 요소를 Iterator를 사용하지 않고 람다식으로 순회하면서 출력 가능한 기능을 제공한다. 람다식을 사용하기 때문에 코드가 훨씬 간결하고 반복자를 사용한 순회방법을 사용하여, 코드 자체의 양을 획기적으로 줄일 수 있는 방법이다.
스트림은 말 그대로 데이터의 흐름이다. 스트림을 통해 배열과 컬렉션의 함수를 조합해서 필터링된 결과값을 얻을 수 있다. 스트림의 또 하나의 장점은 병렬처리가 가능하다는 점이다. 하나의 로직을 잘게 쪼개어 여러개의 작업을 동시에 진행할 수 있다.
스트림이 나오기 전까지 JAVA 6에서는 ArrayList에 담긴 요소를 추출하기 위해서는 반복자 Iterator를 사용했어야 했다. 이것도 적응되면 그렇게 불편한 방법은 아니지만, 더 쉬운 방법이 있는데 Iterator을 계속 사용할 필요는 없다.
public static void main(String[] args){
// ArrayList 생성
ArrayList<Integer> list = new ArrayList<Integer>();
// ArrayList 요소 추가
list.add(1);
list.add(2);
list.add(3);
// Iterator 생성
Iterator<Integer> iter = list.iterator();
// ArrayList 요소 출력
while(iter.hasNext()){
System.out.println(iter.next());
}
}
}
스트림(Stream) 개념
JAVA 8에서 추가된 스트림을 사용하면 훨씬 간단하다. Iterator로 작성된 코드들이 스트림으로 대체되고 있는 이유다. ArrayList의 stream() 메소드를 사용해서 Stream 오브젝트를 생성한 후 forEach() 순회문에서 람다식을 이용한다. 한줄로 순회문이 완성된다. ArrayList에 들어있는 요소들을 'num'으로 추출한 후 람다식을 이용하면 끝이다.
public static void main(String[] args){
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Stream<Integer> stream = list.stream();
stream.forEach(num -> System.out.println(num));
}
스트림(Stream) 개념
스트림을 ArrayList 뿐만 아니라 배열에서도 사용이 가능하다. Arrays 클래스의 stream() 메소드를 이용해서 스트림 객체를 생성한 후 람다식을 이용한 forEach() 함수로 순회를 간단하게 구현할 수 있다. stream() 함수는 리턴값으로 Stream 인스턴스를 반환하게 되어 있다.
public static void main(String[] args){
String[] strArr = {"Canada", "USA", "Russia"};
// Arrays의 stream() 함수 이용
Stream<String> streamStr = Arrays.stream(strArr);
streamStr.forEach(temp -> System.out.println(temp+"\n"));
}
스트림(Stream) 개념
String이나 Int 뿐만 아니라 클래스 배열에서도 Stream을 유용하게 사용할 수 있다. 클래스를 담은 ArrayList를 생성한 후 stream() 메소드로 Stream 오브젝트를 생성한다. 이후 람다식을 이용한 forEach() 함수로 간단하게 클래스 내의 ID값과 Name을 순회 추출할 수 있다.
static class Person{
private int id;
private String name;
public Person(int id, String name){
this.id = id;
this.name = name;
}
public int getId(){
return id;
}
public String getName(){
return name;
}
}
public static void main(String[] args){
ArrayList<Person> personList = new ArrayList<>();
personList.add(new Person(1,"Jacob"));
personList.add(new Person(1,"Mark"));
personList.add(new Person(1,"Letto"));
Stream<Person> personStream = personList.stream();
personStream.forEach(temp -> System.out.println("ID : "+temp.id+" Name : "+temp.name+"\n"));
}
Java Stream.builder()
배열과 ArrayList를 Stream으로 변환해서 사용할 뿐만 아니라 Stream에 직접적으로 데이터를 추가하여 반복자로 추출할 데이터를 구축할 수 있다. <데이터타입>.builder() 함수로 Stream Build를 시작하고 데이터를 추가한 후 마지막에 build()를 통해 stream 오브젝트를 리턴하게 된다.
public static void main(String[] args){
Stream<Integer> stream =
Stream.<Integer>builder().add(1).add(2).add(3).build();
stream.forEach(num -> System.out.println(num));
}
Java Stream.generate()
Stream.generate()을 이용해서 동일한 데이터를 한번에 Stream으로 생성할 수 있다. Stream.generate() 함수로 생성되는 Stream의 경우 길이의 제한이 없는 데이터 흐름이기 때문에 limit() 함수로 Stream의 길이를 따로 지정해줘야 한다.
public static void main(String[] args){
Stream<Integer> stream = Stream.generate(() -> 100).limit(3);
stream.forEach(temp -> System.out.println(temp));
}
더 많은 콘텐츠
'Programming' 카테고리의 다른 글
WebSocket 사용으로 실시간 채팅 애플리케이션 구현 Project (0) | 2022.04.12 |
---|---|
No tests found for given includes 문제 발생시 스프링부트 해결방법 (0) | 2022.04.08 |
스프링부트 SpringBoot 웹 애플리케이션 개발 #7 프론트엔드 인증 구현 (feat React.js) (0) | 2022.04.06 |
스프링 부트 #6 SpringBoot 웹 애플리케이션 개발 스프링 인증 구현 (0) | 2022.04.04 |
스프링 부트 SpringBoot 웹 애플리케이션 개발 #5 백엔드 프론트엔드 통합 구현하기 (0) | 2022.04.02 |
스프링 부트 SpringBoot 웹 애플리케이션 개발 #4 프론트엔드 구현하기 (0) | 2022.04.01 |
댓글