BackEnd/Java

[JAVA] 스트림

박쓸개 2024. 5. 6. 15:11

스트림

Java® Platform, Standard Edition & Java Development Kit Version 21 API Specification

 

java.util.stream (Java SE 21 & JDK 21)

package java.util.stream Classes to support functional-style operations on streams of elements, such as map-reduce transformations on collections. For example: int sum = widgets.stream() .filter(b -> b.getColor() == RED) .mapToInt(b -> b.getWeight()) .sum(

docs.oracle.com

대용량 데이터를 빠르게 처리하기위해서.

시스템이 알아서 데이터를 흘려주거나 수집해서 결과물을 만드는것

함수형프로그래밍의 언어들은 steam처리를 기본으로 제공한다.

 

스트림은 '데이터의 흐름’입니다. 배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해서 중간처리단계에서 우리가 지정한 조건에 따라 원하는 결과를 필터링하거나 분류 또는 가공된 결과를 얻을 수 있습니다.map-reduce 스타일

//예제 - 함수형(병렬처리가 유리함)

     int sum = widgets.stream()//widgets은 우리가 생각하는 그 위젯,,(날씨etc..)
									     //(이 밑으로 파이프라인이라고불림.)
                      .filter(b -> b.getColor() == RED)  //색상을 얻어와서 붉은색인경우만 필터 
                      //b는 위젯에 들어있던 객체가 스트림화되어 넘어옴 객체 
                      .mapToInt(b -> b.getWeight()) //버튼의 웨이트값이 정수일경우 
                      //인트로 반환되는 인스턴스 메서드
                      .sum();//정수의합계 reduce연산
 

컬렉션으로부터 스트림얻기

package sec.p1248;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Stream;

public class StreamTest {

	public static void main(String[] args) {
		//1. 리스트에 저장된 데이터를 Iterator를 이용해서출력
		List<String> fruitList1 = Arrays.asList("apple","banana","orange","mandarine","strawberry");
		Iterator<String> iter = fruitList1.iterator();//Iterator 객체 생성
		System.out.println(iter);//Iterator 객체의 주소를 출력 (주소가 들어있음)
		while (iter.hasNext()) {//다음 요소가 있는지 확인
			String fruit = iter.next();//다음 요소를 가져옴
			System.out.println(fruit);//출력
		}
		
				//2. Enhanced For
		for(var fruit : fruits){
			System.out.println(fruit);
		}
		
		//3. 리스트에 저장된 데이터를 Stream를 이용해서출력
		List<String> fruitList2 = Arrays.asList("apple","banana","orange","mandarine","strawberry");
		Stream<String> fruitStream = fruitList2.stream();//스트림객체 생성
		//방법1
		fruitList2.forEach(name->System.out.println(name));//foreach문과 람다식을 이용해서 출력
		//방법2 
		//fruitList2.forEach(System.out::println);//메서드 참조
		
		//람다식을 익명객체로만들었을때 
//		strings.stream().forEach(new Consumer<String>() {
//		    @Override
//		    public void accept(String name) {
//		        System.out.println(name);
//		    }
//		});
		

		
		
	}//main
}//class

스트림의 특징 - 파이프 라인

Lazy Evaluation (지연연산) 불필요한 연산을 모아놨다가 필요할때 처리하는거

마지막연산이 붙었을때 처리됨?

 

 ❓ Eager Evaluation  vs Lazy Evaluation

[JAVA] Stream 이해 (Lazy 지연연산)

 

[JAVA] Stream 이해 (Lazy 지연연산)

1. 간결하고 가독성이 좋은 코드: 람다를 사용해서 가독성이 좋아진다. 2. 병렬 처리 가능: 병렬 스트림을 사용하면 멀티코어 프로세서의 장점을 활용하여 빠른 속도로 대량의 데이터를 처리할

soobysu.tistory.com

</aside>

자바 스트림 설명부터 사용하는 이유 파헤쳐보기

자바 스트림 설명부터 사용하는 이유 파헤쳐보기 #JAVA #스트림

 

자바 스트림 설명부터 사용하는 이유 파헤쳐보기 #JAVA #스트림

자바 스트림 설명부터 사용하는 이유 파헤쳐보기 #JAVA #스트림 안녕하세요? 장장스입니다. 오늘은 자바 스트림에 대해서 정리해 보겠습니다. 스트림(Stream)이란 무엇인가? 스트림(Stream)은 자바 8 A

zangzangs.tistory.com

[JAVA] 스트림은 주의해서 사용하자

 

[JAVA] 스트림은 주의해서 사용하자

스트림 (Stream) 스트림은 다량의 데이터 처리 작업을 위해 자바 8에서 등장했다. 컬렉션 처리를 위한 새로운 API라고 할 수도 있다. 스트림 구조 스트림은 초기 데이터→ 중간 연산 → 최종 연산 의

dd-developer.tistory.com

[JAVA] 스트림은 주의해서 사용하자

 

[JAVA] 스트림은 주의해서 사용하자

스트림 (Stream) 스트림은 다량의 데이터 처리 작업을 위해 자바 8에서 등장했다. 컬렉션 처리를 위한 새로운 API라고 할 수도 있다. 스트림 구조 스트림은 초기 데이터→ 중간 연산 → 최종 연산 의

dd-developer.tistory.com

스트림 종류

리턴타입 메서드 데이터 소스

Stream<T> java.util.Collection.Stream()
java.util.Collection.paralleStream()
컬렉션
Stream<T> Arrays.stream(T[ ]) Stream.of(T[ ])
Arrays.stream(int[ ]) IntStream.of(T[ ])
배열
IntStream IntStream.range(int, int)
IntStream.rangeClosed(int, int)
int범위
LongStream LongStream.range(long, long)
LongStream.rangeClose(long, long)
long범위
Stream<Path> Files.find(Path, int, BiPredicate, FileVisitOption) 디렉터리
Stream<String> Fies.lines(Path, Charset) 텍스트 파일
IntStream Randoms.ints() 랜덤 수

 

 

컬렉션에서 스트림얻기

package sec.p1250;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class CollectionToStream {

	public static void main(String[] args) {
		List<Student> studentList = new ArrayList<Student>();
		studentList.add(new Student("제우스", 1));
		studentList.add(new Student("오너", 2));
		studentList.add(new Student("대상혁", 1));
		studentList.add(new Student("구마유시", 4));
		studentList.add(new Student("케리아", 5));
		
		for (int i = 0; i < studentList.size(); i++) {
			System.out.println("T1 :"+studentList.get(i).getName());
		}//일반 포문
		
		for (Student student : studentList) {
			System.out.println("T1 :: "+student.getName());
		}
		
	
	Stream<Student> stream = studentList.stream();//스트림객체 생성
		stream
			.map(Student::getName)//이름만 뽑아오기
			.forEach(System.out::println);//최종상태만 뽑는 foreach 
	
	}//main
}//class

 

❓ Stream API기능

Stream API 연습하기

 

Stream API 연습하기

Java8부터 생긴 Stream 기능의 API를 연습하고 이를 정리 후 포스팅했습니다.

velog.io

 

스트림 파이프 라인

스트림 메서드 1편

 

스트림 메서드 1편

스트림과 컬렉션 모두 연속된 요소 형식의 값을 저장하는 자료구조의 인터페이스를 제공합니다.컬렉션의 경우 모든 요소들이 미리 계산이 되어 있고, 스트림은 요청할 때만 요소를 계산합니다.

velog.io

중간 처리 스트림 메서드

flatMapxxx()메서드

리턴타입메서드설명

리턴타입 메서드 설명
Stream<R> flatMap(Function<T, Stream<R>) 객체 T를 Stream<R>로 변환
DoubleStream flatMap(DoubleFunction<DoubleStream>) double타입을 DoubleStream으로 변환
IntStream flatMap(IntFunction<IntStream>) int 타입을 IntStream으로 변환
DoubleStream flatMapToDouble(Function<T, DoubleStream>) 객체 T를 DoubleStream으로 변환

한 개의 요소를 여러개의 요소로 변환( 1 : n )할 때 사용한다.

리턴타입 메서드 설명

 

최종 처리 스트림 메서드

Optional 클래스

자바8 Optional 1부: 빠져나올 수 없는 null 처리의 늪

 

자바8 Optional 1부: 빠져나올 수 없는 null 처리의 늪

Engineering Blog by Dale Seo

www.daleseo.com

[Java] Optional이란? Optional 개념 및 사용법 - (1/2)

 

[Java] Optional이란? Optional 개념 및 사용법 - (1/2)

이번에는 Java8부터 지원하는 Optional 클래스에 대해 알아보도록 하겠습니다. 1. Optional이란? Optional 개념 및 사용법 [ NPE(NullPointerException) 이란? ] 개발을 할 때 가장 많이 발생하는 예외 중 하나가 바

mangkyu.tistory.com

Optional이란?

Optional는 “존재할 수도 있지만 안 할 수도 있는 객체”, 즉, “null이 될 수도 있는 객체”을 감싸고 있는 일종의 래퍼 클래스

 

 ❓ Optional 과 Excetpion예외처리의 차이 Optional은 값이 없는 상황을 명시적으로 처리하고, 예외 처리는 예외적인 상황을 대비하여 처리합니다. Optional은 값이 없는 경우를 프로그램 흐름으로 다루는 반면, 예외 처리는 예외적인 상황을 처리하고 프로그램의 흐름을 중단하거나 변경

 

요소 수집 메서드

collect()메서드사용하기

Interface Collector<T,A,R> 컬렉터 인터페이스

Java® Platform, Standard Edition & Java Development Kit Version 21 API Specification

 

Collector (Java SE 21 & JDK 21)

Type Parameters: T - the type of input elements to the reduction operation A - the mutable accumulation type of the reduction operation (often hidden as an implementation detail) R - the result type of the reduction operation public interface Collector A m

docs.oracle.com