스트림 이해 안되서 글 보고 쓰기 공부법 들어간다
출처:https://hbase.tistory.com/171
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
사용
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();
// 애플 바나나 멜론 순서로 문자열 데이터를 처리.
//데이터를 생성하는 람다식을 이용해서 스트림을 생성함.
public static<T> Stream<T> generate (Supplier<T> s){...}
//Supplier에 해당하는 람다식이 데이터를 생성.
Stream<String> stream =Stream.generate(() -> "Hello").limit(5);
// Hello 찍어냄. 무한 생성 limit() 메소드를 이용해 스트림이 5개만 제한
//수열 형태 데이터 생성
Stream<String> stream = Stream.iterate(100, n-> n+10).limit(5);
//출력 결과: 100 부터 10씩 증가 하는 숫자 생성
Stream<Integer> stream = IntStream.range(1,10).boxed();
boxed가 뭘까?
자바 Int 변수를 다룰 때 Integer 클래스로 오토박생해서 처리하는 경우:
오버헤드 발생!~! => 성능저하
스트림 객체에서는 이를 위해
제네릭을 이용한 클래스로 사용 시 박식 사용
Stream<Integer> stream = IntStream.range(1,10).boxed();
Stream<Integer> stream = IntStream.range(1,10).boxed();
stream.filter(v -> ((v %2) ==0))
.forEach(System.out::println);
//출력결과 :
//2,4,6,8
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
스트림데이터 정렬시 사용
오름 차순,, 내림차순 등등
지금까지는 중간작업
데이터 가공, 필터링 후 그 값을 컬렉션으로 모우는 작업 필요
정수 값을 받는 스트림의 마무리는 '총합'을 구하거나 '최대값','최소값', '숫자의개수', '평균값
등에 대한 계산.
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();
스트림에서 뽑아져 나온값에 작업할때
리턴하지 않음
Set<Integer> evenNumber = IntStream.range(1,1000).boxed()
.filter(n -< (n%2 ==0))
.forEach(System.out:println);
// 출력결과:
1 부터 999까지 숫자 중 짝수만 뽑아냄