순차 및 병렬 Aggregate 작업을 지원하는 일련의 요소입니다. 다음 예에서는 Stream 및 IntStream을 사용한 집계 작업을 보여 줍니다.
✍ 자료가 있는 배열이나 컬렉션 또는 특정 범위 안에있는 일련의 숫자를 처리하는 기능이 미리 구현되어있음.
✍ 스트림을 생성하고, 중간 연산 조건을 지정하고, 최종 연산 처리.
✍ 그렇다고 해서, 기존 자료를 변경하거나, 생성된 스트림을 재사용 할 수는 없다.
filter - 조건을 넣고 그 조건에 맞는 참인 경우 추출,
문자열 배열이 있을 때 문자열의 길이가 5이상인 경우를 추출한다면 다음과 같다.
List<String> sList = new ArrayList<>();
sList.stream().filter(s -> s.length() >= 5).forEach(s -> System.out.println(s));
public static void main(String[] args) {
String[] params = {"s3","123","1232313"};
params = Arrays.stream(params).filter(i-> !i.equalsIgnoreCase("s3")).toArray(String[]::new);
System.out.println(Arrays.toString(params));
}
return :: [123, 1232313]
map - 클래스가 가진 자료 중 이름 (customer 클래스에 name 필드를 만들었다면,)만 출력하는 경우에 사용.
Customer customer = new Customer();
List<Customer> customerList = new ArrayList<>();
customerList.stream().map( c -> c.getName()).forEach(s -> System.out.println());
배열 값을 더하고, 개수를 세고,
int[] arr = {1,2,3,4,5};
int sumVal = Arrays.stream(arr).sum();
int count = (int)Arrays.stream(arr).count();
리스트에 선언해서 담았다.
List<String> sList = new ArrayList<>();
sList.add("min-su");
sList.add("chul-su");
sList.add("gyung-su");
굳이 Stream 객체를 선언한다면 다음과 같다.
// 내부적으로 sList의 모든 요소를 가지고 있게 된다.
Stream<String> stream = sList.stream();
forEach()
// forEach()를 쓴다면 모든 요소를 하나씩 가져와서 처리한다.
// 차례대로 가져와서 변수 s에 대입되고 이를 매개변수로 받아 출력문이 호출.
stream.forEach(s -> System.out.println(s));
forEach()를 앞서 썼기 때문에 메서드가 수행되면서 자료가 소모되었다.
따라서 스트림을 새로 생성해야 한다.
//Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
// at java.util.stream.AbstractPipeline.sourceStageSpliterator(AbstractPipeline.java:279)
// at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
// at com.org.datastructure.StreamTest.main(StreamTest.java:24)
// 소모 되어서 쓸 수 없다.
stream.forEach(s -> System.out.println(s + " 소모 ㅠ "));
정렬
// 스트림 생성 + 정렬 + 요소를 하나씩 꺼내서 출력.
sList.stream().sorted().forEach(s -> System.out.println(s));
연산은 기능이 미리 정해져 있지만, reduce() 연산은 내부적으로 스트림의 요소를 하나씩 소모하면서
사용자가 직접 지정한 기능을 수행한다.
T identify는 초깃값이고, BinaryOperator accumulator 는 수행해야 할 기능이다.
# JDK 제공
T reduce (T identify, BinaryOperator<T> accumulator)
BinaryOperator인터페이스를 직접 구현한 람다식을 써도 되고, 인터페이스를 구현한 클래스를 생성해도 대입해도 된다.
하지만 함수형 인터페이스이므로, apply() 메서드를 반드시 구현(@Override)해야 한다.
람다식을 직접 구현한다면.
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;
}));
바이트 수가 더 긴 문자열을 반환한다.
모든 요소의 합을 구할 때에, 두 번째 매개변수에 람다식이 들어간 케이스
Arrays.stream(arrayss).reduce(0, (a,b) -> a + b);
이런 선언도 가능함.
Integer sumValue = Arrays.stream(arr).reduce(0, Integer::sum);
✍ Stream은 물론 가독성도 좋고, 유지보수에 편하다. 하지만 성능은 일반적인 상황에서 비교 할 경우 for-loop문에 비해 느린 경우가 대부분이다.
아래 같이 쓰는 경우도 꽤 편하다.
List<Integer> --> int[]
List<Integer> temp = new ArrayList<Integer>();
temp.add(1);
temp.add(2);
temp.add(3);
int[] example1 = temp.stream().mapToInt(i->i).toArray();
System.out.println(Arrays.toString(example1);
'JAVA' 카테고리의 다른 글
jwt 토큰 인증 + Interceptor 검증. (0) | 2022.05.22 |
---|---|
java 정규 표현식 (0) | 2022.05.09 |
Stack (0) | 2022.02.23 |
java / POI / excel (0) | 2022.02.03 |
FTP 클라이언트 (0) | 2022.02.03 |