스트림이란?
흐름 데이터 세트 간에서 데이터의 전송이 실행되고 있는 것 으로, 문자 형식의 데이터 항목이 연속한 열로 되어 있는 것. 즉, 스트림은 운영체제에 의해 생성되는 가상의 연결 고리 를 의미하며, 중간 매개자 역할을 한다.
스트림의 특징
- 자료의 대상과 관계없이 동일한 연산을 수행
- 배열, 컬렉션에 동일한 연산이 수행되어 일관성 있는 처리 가능
- 한번 생성하고 사용한 스트림은 재사용 불가
- 스트림 연산은 기존 자료를 변경하지 않음
- 중간 연산과 최종 연산으로 구분
- 최종 연산이 수행되어야 모든 연산이 적용되는 지연 연산
스트림 문법 - 중간 연산
filter(), map()
문자열의 길이가 5 이상인 요소만 출력
sList.stream().filter(s -> s.length() >= 5).forEach(s -> System.out.println(s));
고객 클래스에서 고객 이름만 기져오기
custList.stream().map(c -> c.getName()).forEach(s -> System.out.println(s));
스트림 문법 - 최종 연산
forEach(), count(), sum() 등
int sum = Arrays.stream(arr).sum(); int count = (int)Arrays.stream(arr).count();
스트림의 자료를 소모하면서 연산을 수행
최종 연산 후 스트림은 더 이상 다른 연산 불가
스트림 예제
- List 출력
package stream;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class ArrayListStreamTest {
public static void main(String[] args) {
List<String> sList = new ArrayList<String>();
sList.add("Tomas");
sList.add("Edward");
sList.add("Jack");
Stream<String> stream = sList.stream();
stream.forEach(s->System.out.print(s + " ")); // Tomas Edward Jack
System.out.println();
//최종 연산된 stream은 사용 불가 임으로 새로 생성
sList.stream().sorted().forEach(s->System.out.print(s + " ")); // Edward Jack Tomas -> Comparable 에 의해 정렬
System.out.println();
//길이 수를 가져와 출력
sList.stream().map(s->s.length()).forEach(n->System.out.println(n)); // 5 6 4
}
}
reduce() 연산
- 정의된 연산이 아닌 프로그래머가 직접 지정하는 연산을 적용
- 최종연산으로 스트림의 요소를 소모하며 연산 수행
reduce() 예제
- 배열의 모든 값의 합
package stream;
import java.util.Arrays;
public class IntArrayTest {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
int sum = Arrays.stream(arr).sum();
System.out.println(sum); // 15
// 초기값이 0 이며 a,b 를 매개변수로 받아 a+b 합을 루프를 통해 구함
System.out.println(Arrays.stream(arr).reduce(0, (a,b)->a+b)); // 15
}
}
- 문자열 배열에서 가장 긴 문자열을 출력
package stream;
import java.util.Arrays;
import java.util.function.BinaryOperator;
class CompareString implements BinaryOperator{
@Override
public String apply(String s1, String s2) {
if(s1.getBytes().length >= s2.getBytes().length)
return s1;
else return s2;
}
}
public class ReduceTest {
public static void main(String[] args) {
String[] greetings = {"안녕하세요~~~", "hello", "Good morning", "반갑습니다"};
// 람다식으로 직접 구현
System.out.println(Arrays.stream(greetings).reduce("", (s1, s2)->
{ if(s1.getBytes().length >= s2.getBytes().length)
return s1;
else return s2;
}));
// 클래스 구현을 통해 BinaryOperator 를 전달받아 출력
System.out.println(Arrays.stream(greetings).reduce(new CompareString()).get());
}
}
'Programming > Java' 카테고리의 다른 글
[Java] 람다식 (lambda) (0) | 2021.01.13 |
---|