티스토리 뷰

JAVA

[JAVA] Stream

PeonyF 2022. 9. 14. 11:10
반응형

사용이유

for과 Iterator의 경우 코드가 너무 길고 알아보기 힘들며 재사용이 떨어짐, 데이터소스마다 다른 방식으로 다뤄야 한다는 문제점도 있음(Collection.sort(), Arrays.sort()) 이런 문제를 해결하기 위해 stream을 사용함

 

- 스트림은 데이터 소스를 변경하지 않는다.

- 스트림은 일회용이다

- 스트림은 작업을 내부 반복으로 처리한다.

 

 

 

*Map,Of

map : 원하는 필드만 뽑아내거나 특정형태로 변환해야 할때 사용 

of : 배열을 소스로 하는 스트림을 생성할때 사용 

ex. Stream.of("a","b","c") //가변인자

      Stream.of(new String[]{"a","b","c"})

      Arrays.stream(new String[]{"a","b","c"})

private static Set<Integer> convertToSet(String inputLottoNumbers) {
    String[] splitLottoNumbers = inputLottoNumbers.split(DELIMITER);
    return Stream.of(splitLottoNumbers)
            .map(Integer::new) //Integer로 변환
            .collect(Collectors.toSet());
}
public List<Integer> getLottoNumbers() {
    return lottoNumbers.stream()
            .sorted()
            .collect(Collectors.toList());
}
int [] intArrays = Stream.of("246".split(""))
        .mapToInt(Integer::parseInt)
        .toArray();

return Arrays.stream(intArrays)
        .boxed()
        .collect(Collectors.toSet());

 

*mapToInt : 스트림을 IntStream으로 변환

Stream 에서 sum() 을 사용하려면 IntStream, LongStream, DoubleStream 와 같은 기본형 (Primitive Type) 특화 스트림을 사용해야 합니다.

그래서 보통 mapToInt, mapToLong, mapToDouble 같은 메소드로 스트림을 변환시키고 사용

list.stream().mapToInt(i -> i.intValue()).toArray()
ans = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
    ans[i] = list.get(i);
}

* Filter : 주어진 조건에 맞지않는 요소를 걸러낸다.

public WinningRank checkWinningRank(LottoTicket winningLottoTicket) {
    long matchingCount = winningLottoTicket.getLottoNumbers()
            .stream()
            .filter(winningNumber -> this.lottoNumbers.contains(winningNumber))
            .count(); //최종연산
    return WinningRank.findRanking(matchingCount);
}

스트림이 아니라면 아래와 같은 뜻, filter -> if문 

long matchingCount = 0;
for(int winningNumber : winningLottoTicket.getLottoNumbers()){
   if( this.lottoNumbers.contains(winningNumber)){
    	count++;
    }
 }
 return memberRepository.findByLoginId(loginId).filter(member -> member.getPassword().equals(password))
                .orElse(null);
Optional<Member> findMemberOptional = memberRepository.findByLoginId(loginId);
Member member = findMemberOptional.get();

if (member.getPassword().equals(password)) {
    return member;
} else {
    return null;
}

 

 public int[] divisible(int[] array, int divisor) {
        //ret에 array에 포함된 정수중, divisor로 나누어 떨어지는 숫자를 순서대로 넣으세요.
        return Arrays.stream(array).filter(factor -> factor % divisor == 0).toArray();
    }

*list를 array로 변경

 arr                                          divisor                         return

[5, 9, 7, 10] 5 [5, 10]

 

private List<WinningRank> checkLottoRank(String lastWinningNumbers){
    LottoTicket winningTicket = new LottoTicket(lastWinningNumbers);
    return lottoTickets.stream()
            .map(lottoTicket -> lottoTicket.checkWinningRank(winningTicket))
            .filter(winningRank -> winningRank != WinningRank.NOTHING)
            .collect(Collectors.toSet());
}

 

*IntStream, rangeClose,box,collect

IntStream: 기본 타입값들을 직접 저장하도록 하는 방식 shot,cjar,byte,boolean 저장시 사용

rangeClose : 경계 끝 값을 포함한다.

range() : 경계 끝 값 미포함

boxed() :기본형 스트림(IntStream) -> 스트림(Stream)

  private void initLottoNumbers() {
        List<Integer> initNumbers = IntStream.rangeClosed(INIT_NUMBER, LIMITED_NUMBER)
                .boxed()
                .collect(Collectors.toList());
        this.numbers = initNumbers;
    }

 

*limit,collect

linit : n개 이후 새 스트림 반환. 이 메서드는 무한 스트림을 원하는 크기로 자를때 특히 유용하다.(자르기,중간연산)

  @Override
    public Set<Integer> getLottoNumbers() {
        Collections.shuffle(numbers);
        return numbers.stream()
                .limit(LOTTO_NUMBERS_COUNT)
                .collect(Collectors.toSet());
    }

 

출저 : Java의 정석.가장 빨리 만나는 코어 자바9,https://bcp0109.tistory.com/299

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함