JAVA

java Stream

2022. 3. 8. 22:40
728x90
반응형

 순차 및 병렬 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);
320x100
반응형
저작자표시 (새창열림)

'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
'JAVA' 카테고리의 다른 글
  • jwt 토큰 인증 + Interceptor 검증.
  • java 정규 표현식
  • Stack
  • java / POI / excel
girin_dev
girin_dev
기록합시다.
250x250
girin_dev
girin_dev
girin_dev

github.com/jaemanc


전체
오늘
어제
  • 분류 전체보기 (122)
    • ALGORITHM (23)
    • AWS (4)
    • Effective Java (4)
    • ERROR (12)
    • DB (11)
    • JAVA (23)
      • SPRING (10)
    • PYTHON (5)
      • TOY_PROJECT (1)
    • MOBILE (4)
    • SERVER (8)
    • TIPS (16)
    • WAS (2)
    • 새싹 일기 (5)
    • DATA (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 새싹
  • dp
  • 프로그래머스
  • Flutter
  • 다이나믹 프로그래밍
  • error
  • springboot
  • python3
  • lis
  • oracle cloud
  • Effective Java
  • 가장 큰 수
  • IntelliJ
  • java
  • offset
  • 바질 페스토
  • centos7
  • react-native
  • vertica
  • 바둑이
  • jwt
  • JAVA 11
  • CentOS 8
  • querydsl
  • oracle
  • Chat GPT
  • 바질
  • 바질 키우기
  • spring boot
  • docker

최근 댓글

최근 글

hELLO · Designed By 정상우.
girin_dev
java Stream
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.