본문 바로가기
public void static main()/Book

[Effective Java] 아이템 45

by 햄리뮤 2023. 2. 7.
반응형

책 읽는것도 너어어어어어ㅓ어ㅓ무 힘들구나

[책 규칙]

노란색 - 자세히 알아보고싶은 부분

초록색 - 핵심 개념 (블로그 정리시는 검은색으로!)

빨간색 - 무슨말인지 모르겠는 부분

[아이템 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!

 

 

오늘도 도움을 주신 파워 블로거분들 너무 감사합니다. 너모 힘드네여 공부하기! 공부할꺼 징짜 많아~

 

https://jaehoney.tistory.com/133#:~:text=%EC%9E%90%EB%B0%94%208%EC%97%90%EC%84%9C%20%EC%B6%94%EA%B0%80%EB%90%9C,%EC%9D%B4%EA%B2%8C%20%EC%B2%98%EB%A6%AC%ED%95%A0%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4.

 

Java 8 - Stream이란? (+ ParallelStream)

Stream 자바 8에서 추가된 스트림(Streams)은 컬렉션, 배열 등에 저장된 요소들을 하나씩 참조하면서 코드를 실행할 수 있는 기능입니다. Stream을 사용하면, 불필요한 for문을 사용하지 않을 수 있고,

jaehoney.tistory.com

** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.

이곳 저곳에서 구글링한 것과 강의 들은 내용이 정리가 되었습니다.

그림들은 그림밑에 출처표시를 해놓았습니다.

문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **

반응형

댓글