티스토리 뷰
사용이유
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
'JAVA' 카테고리의 다른 글
[JAVA] JVM (0) | 2023.01.14 |
---|---|
[JAVA] 객체지향설계 5원칙 - SOLID (0) | 2022.11.07 |
ArrayList 정렬 : Comparable 과 Comparator (0) | 2020.01.06 |
향상된 For 문(+ArrayList에서 index 가져오기) (0) | 2020.01.06 |
객체 배열이란(클래스를 배열로 선언하기) (0) | 2020.01.03 |