[JAVA] 스트림

김동하·2023년 11월 30일
0

스트림 이해 안되서 글 보고 쓰기 공부법 들어간다
출처:https://hbase.tistory.com/171

업로드중..

자바 스트림(Stream)이란

java 8 부터 지원되기 시작함.
컬렉션에 저장되어 엘리먼트들을 하나씩 순회하며
처리하는 코드패턴. 람다식과 함께 사용되 데이터 처리 간결하게 함.


복습 : 배열 선언

스트림에 앞서 배열 선언과 재 생성을 복습하자

//배열은 길이가 정해져있다.
//같은타입만 넣을 수 있다. 이차원배열이아닌이상
//**값 목록으로 배열생성**
//1.  타입[] 변수;
//2. 타입 변수[];
//값 미리 선언
String [] names ={"값1", "값2"};
//값 나중에 선언
int[] names = null;
names = new int [] { 1, 2, 3};

// **new 연산자로 배열 생성 **
String [] names = new String[3];

스트림 사용법


스트림생성-배열 Arrays.stream

먼저 생성.
배열은 Arrays.stream사용

String[] arr = new String[]{"a", "b","c"}
String<String> stream = Arrays.stream(arr);
Stream <String> streamofArrayPart= Arrays.stream(arr, 1,3); 
//인덱스 1포함, 3 제외 => ("b", "c")

스트림생성-컬렉션

List<String list = Arrays.asLsti("a","b","c");
Stream<String> stream = list.stream();

스트림생성-빌더

직접 값 입력함
String<String> stream = Stream<String> builder()
	.add("Apple")
    .add("Banana")
    .add("Melon")
    .build();
// 애플 바나나 멜론 순서로 문자열 데이터를 처리.    

스트림생성 -Generator

//데이터를 생성하는 람다식을 이용해서 스트림을 생성함.
public static<T> Stream<T> generate (Supplier<T> s){...}
//Supplier에 해당하는 람다식이 데이터를 생성. 
Stream<String> stream =Stream.generate(() -> "Hello").limit(5);
// Hello 찍어냄. 무한 생성 limit() 메소드를 이용해 스트림이 5개만 제한 

스트림생성 - iterate

//수열 형태 데이터 생성
Stream<String> stream = Stream.iterate(100, n-> n+10).limit(5);
//출력 결과: 100 부터 10씩 증가 하는 숫자 생성

스트림 데이터가공

Filter

Stream<Integer> stream = IntStream.range(1,10).boxed();

boxed가 뭘까?
자바 Int 변수를 다룰 때 Integer 클래스로 오토박생해서 처리하는 경우:

오버헤드 발생!~! => 성능저하
스트림 객체에서는 이를 위해

제네릭을 이용한 클래스로 사용 시 박식 사용

Stream<Integer> stream = IntStream.range(1,10).boxed();

filter예제

  1. 1 ~ 9 까지 데이터를 뽑아내는 스트림 만들고
  2. filter 메소드에 짝수 선별하는 람다식
  3. 짝스 데이터만 뽑아내는 객체 리턴
Stream<Integer> stream  = IntStream.range(1,10).boxed();
stream.filter(v -> ((v %2) ==0))
	.forEach(System.out::println);

//출력결과 :
//2,4,6,8

Map

map()은 스트림에서 뽑아져 나온는 데이터를 변경

Map 예제

짝수에다가 10씩 곱하기

Stream<Integer> stream = IntStream.range(1,10).boxed();
stream.filter(v -> ((V%2) ==0))
	.map(v -> v *10)
    .forEach(System.out::println);
//출력결과:
//20, 40, 60, 80

Sorted

스트림데이터 정렬시 사용
오름 차순,, 내림차순 등등

스트림 결과 생성

지금까지는 중간작업
데이터 가공, 필터링 후 그 값을 컬렉션으로 모우는 작업 필요

통계값

정수 값을 받는 스트림의 마무리는 '총합'을 구하거나 '최대값','최소값', '숫자의개수', '평균값
등에 대한 계산.

int sum = IntStream.range(1,10).sum();
int count = IntStream.range(1,10).count();

int max = IntStream.range(1,10).max();
int min = IntStream.range(1,10).min();
int avg =IntStream.range(1,10).average();

//짝수 숫자의 총합
int evenSum = IntStream.range(1,10)
	.filter(v-> ((v%2) ==))
    .sum();
    

foreach

스트림에서 뽑아져 나온값에 작업할때
리턴하지 않음

Set<Integer> evenNumber = IntStream.range(1,1000).boxed()
	.filter(n -< (n%2 ==0))
    .forEach(System.out:println);
// 출력결과:
1 부터 999까지 숫자 중 짝수만 뽑아냄 

0개의 댓글