반응형
책 읽는것도 너어어어어어ㅓ어ㅓ무 힘들구나
[책 규칙]
노란색 - 자세히 알아보고싶은 부분
초록색 - 핵심 개념 (블로그 정리시는 검은색으로!)
빨간색 - 무슨말인지 모르겠는 부분
[아이템 45] 스트림은 주의해서 사용하라!!!!
스트림?
- 다량의 데이터 처리 작업(순차적이든 병렬적이든)을 돕고자 자바 8에 추가되었다! (책)
- 컬렉션, 배열 등에 저장된 요소들을 하나씩 참조하면서 코드를 실행할 수 있는 기능이다!
- 불필요한 for문을 사용하지 않을 수 있고, 람다식을 활용할 수 있어서 코드를 직관적이게 처리할 수 있다!
스트림 특징
- 데이터를 담는 저장소는 아니다!
- 데이터를 변경하지 않는다!
- 재사용 할 수 없다!
- 무제한일 수도 있다!
스트림 구조(스트림 파이프 라인)
데이터.Stream생성().중개연산()...종료연산() |
|
중개 연산 | - 계속 연산을 추가할 수 있다. - Stream을 리턴한다. - Lazy하다 (종료 연산이 오기 전에는 실행하지 않음) - Stateless/Stateful 오퍼레이션으로 구분할 수 있다.(sorted의 경우 Stateful. 이전 데이터를 참조하기 때문) - filter(), map(), limit(), skip(), sorted(), ... |
종료 연산 | - 더 이상 연산을 연결할 수 없다. - Stream을 리턴하지 않는다. - collect(), allMatch(), count(), forEach(), min(), max(), ... |
names.stream().skip(3).map((n) -> {
System.out.println(n);
return "success";
});
스트림 주의사항!
- 과용하면 프로그램이 읽거나 유지보수하기 어려워진다!
public class Anarams {
// 쒸익 쒸익 울그락 불그락 뭐라고 짜놓은거야!
public static void main(String[] args) tjrpws IOException {
Path dictionary = Paths.get(args[0]);
int minGroupSize = Integer.parseInt(args[1]);
try (Stream<String< words = Files.lines(dictionary)) {
words.collect(
groupingBy(word -> word.chars().sorted()
.collect(StringBuilder::new,
(sb, c) -> sb.append((char) c),
StringBuilder::append).toString()))
.values().stream()
.filter(group -> group.size() >= minGroupSize)
.map(group -> group.size() + ": " + group)
.forEach(System.out::pringln);
}
}
}
- char 값들을 처리할 때는 스트림을 삼가하는 편이 낫다!
"Hello world!:.chars().forEach(System.out::print);
// Hello world! 출력을 기대했겠지만 Nope! 어림도 없지!
// 7210110810811132119111111410810 이 나온다! (숫자 틀릴수도있음ㅋ)
이렇게 해줘야함!
"Hello world!:.chars().forEach(x -> System.out.print((char) x));
결론
중간 정도 복잡한 작업에도 스트림과 반복문을 적절히 조합하는 게 최선이다!
기존 코드는 스트림을 사용하도록 리팩터링하되, 새 코드가 더 나아 보일 때만 반영하자!
아래와 같은 일 중 하나를 수행하는 로직이라면 스트림을 적용하기 딱 좋은 후보이다!
- 원소들의 시퀀스를 일관되게 변환한다.
- 원소들의 시퀀스를 필터링한다.
- 원소들의 시퀀스를 하나의 연산을 사용해 결합한다. (더하기, 연결하기, 최솟값 구하기 등)
- 원소들의 시퀀스를 컬렉션에 모은다. (공통된 속성을 기준으로 묶어가며...)
- 원소들의 시퀀스에서 특정 조건을 만족하는 원소를 찾는다!
핵심정리
스트림을 사용해야 멋지게 처리할 수 있는 일이 있고, 반복 방식이 더 알맞은 일도 있다.
그리고 수많은 작업이 이 둘을 조합했을 때 가장 멋지게 해결된다. 어느 쪽을 선택하는 확고부동한 규칙은 없지만 참고할 만한 지침 정도는 있다. 어느 쪽이 나은지가 확연히 드러나는 경우가 많겠지만, 아니더라도 방법은 있다. 스트림과 반복 중 어느 쪽이 나은지 확신하기 어렵다면 둘 다 해보고 더 나은 쪽을 택하라!!!
이상 여기까지 정리하게되었습니다!
Yes I can!
오늘도 도움을 주신 파워 블로거분들 너무 감사합니다. 너모 힘드네여 공부하기! 공부할꺼 징짜 많아~
Java 8 - Stream이란? (+ ParallelStream)
Stream 자바 8에서 추가된 스트림(Streams)은 컬렉션, 배열 등에 저장된 요소들을 하나씩 참조하면서 코드를 실행할 수 있는 기능입니다. Stream을 사용하면, 불필요한 for문을 사용하지 않을 수 있고,
jaehoney.tistory.com
** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.
이곳 저곳에서 구글링한 것과 강의 들은 내용이 정리가 되었습니다.
그림들은 그림밑에 출처표시를 해놓았습니다.
문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **
반응형
'public void static main > Book' 카테고리의 다른 글
[CISCO NETWORK] PART 1 (0) | 2023.02.13 |
---|---|
[Effective Java] 아이템 48 (0) | 2023.02.08 |
[Effective Java] 아이템 41 (0) | 2023.01.31 |
[Effective Java] 아이템 35 (0) | 2023.01.30 |
[Effective Java] 아이템 33 (이거 보지마세여! 다시 정리할꺼에요!) (0) | 2023.01.25 |
댓글