From 21451dc4fc757924503a734c7d1e903ac17d4b03 Mon Sep 17 00:00:00 2001 From: Hogwon CHOI Date: Sat, 20 Feb 2021 01:49:09 +0900 Subject: [PATCH] =?UTF-8?q?item47=20=EB=AC=B8=EC=84=9C=20=EC=B4=88?= =?UTF-8?q?=EC=95=88=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item0.md" | 11 --- .../item47.md" | 81 +++++++++++++++++++ 2 files changed, 81 insertions(+), 11 deletions(-) delete mode 100644 "7\354\236\245_\353\236\214\353\213\244\354\231\200_\354\212\244\355\212\270\353\246\274/item0.md" create mode 100644 "7\354\236\245_\353\236\214\353\213\244\354\231\200_\354\212\244\355\212\270\353\246\274/item47.md" diff --git "a/7\354\236\245_\353\236\214\353\213\244\354\231\200_\354\212\244\355\212\270\353\246\274/item0.md" "b/7\354\236\245_\353\236\214\353\213\244\354\231\200_\354\212\244\355\212\270\353\246\274/item0.md" deleted file mode 100644 index 86db8e5..0000000 --- "a/7\354\236\245_\353\236\214\353\213\244\354\231\200_\354\212\244\355\212\270\353\246\274/item0.md" +++ /dev/null @@ -1,11 +0,0 @@ -# Item 0. 제목은 H1로 써주세요 - -템플릿 페이지 입니다. - -### 소제목 부터는 H3로 써주세요 - -소제목 내용 입니다. - -- 이 페이지를 복사해서 파일명을 담당한 아이템 번호에 맞게 변경 후 작업하면 편해요 -- 브랜치 명은 `item*`으로 지으세요 -- 내용 작성 완료 후 `main` 브랜치를 향해 PR을 열어 주세요 diff --git "a/7\354\236\245_\353\236\214\353\213\244\354\231\200_\354\212\244\355\212\270\353\246\274/item47.md" "b/7\354\236\245_\353\236\214\353\213\244\354\231\200_\354\212\244\355\212\270\353\246\274/item47.md" new file mode 100644 index 0000000..1eebecc --- /dev/null +++ "b/7\354\236\245_\353\236\214\353\213\244\354\231\200_\354\212\244\355\212\270\353\246\274/item47.md" @@ -0,0 +1,81 @@ +# Item 47. 반환 타입으로는 스트림보다 컬렉션이 낫다 + + + +### java 7이전 일련의 원소를 반환할 때 + +- Collection, Set, List ( Collection interface ) +- Iterable or Array + +만약 Collection 메소드를 사용할 수 없다면, Iterable 인터페이스를 사용하였습니다. + +
+ +### **java 8 이후 스트림 개념이 도입된 후** + +- 원소 시퀸스를 반환할 때는 스트림을 사용합니다. + +하지만 for-each 로 원소들을 반복하기 원하는 경우 스트림은 적절치 않습니다. + +
+ +**반환값을 선택할 때는 스트림과 반복을 고려해야 합니다** + +- Stream은 for-each를 지원하지 않습니다. Stream은 Iterable 인터페이스가 정의된 것과 동일하게 작동하지만, Stream이 Iterable을 확장하지 않기 때문입니다. + +
+ +### Stream를 Iterable로 중개해주는 어댑터 + +``` +public static Iterable iterableOf(Stream stream) { + return stream::iterator; +} +// java에서 따로 지원해주는 API는 없다. + +``` + +위와 같은 어댑터를 이용하면 Stream 에서도 for-each 문으로 반복할 수 있게 됩니다. + +
+ +### 파일을 읽을 때 Stream과 Iterable + +이전 45장에서 파일을 읽을 때 + +- Stream 버전: `Files.lines` +- Iterable 버전: `scanner` + +java에서는 `File.lines` 가 파일을 읽는 경우 중간의 예외를 자동으로 처리해주기 때문에 훨씬 유리합니다. + +히지만 Iterable 버전에서는 바로 `File.lines` 을 사용할 수가 없습니다. + +그래서 Iterable만 반환하는 API에서는 파일을 읽기 위해 Stream으로 처리할 수 있도록 만들어주어야 합니다. + +``` +public static Stream streamOf(Iterable iterable) { + return StreamSupport.stream(iterable.spliterator(), false) +} +// java에서 따로 지원해주는 API는 없다. + +``` + +위와 같은 어댑터를 이용하면 Iterable 값들도 `File.lines` 을 사용할 수 있습니다. + +
+ +### Iterable의 하위 타입이면서 stream 메소드도 제공하는 Collection 인터페이스 + +Collection 인터페이스는 Iterable의 하위 타입이면서 스트림을 동시에 지원합니다. + +그러므로 **원소 시퀸스를 반환하는 공개 API의 반환 타입에는 Collection이나 그 하위 타입을 쓰는 것이 일반적으로 좋습니다.** + +**주의사항** + +무조건 Collection 인터페이스만 사용하여 덩치큰 시퀸스를 메모리에 올리는 실수를 범하지 말아야 합니다. + +ex) 책에서는 멱함수를 예로 들며 멱함수와 같은 케이스에서 Stream과 Iterable을 모두 호환시키기 위해 Collection 인터페이스를 이용하는 것은 잘못되었다고 지적합니다. + +이런 문제가 생길 때는 Collection 인터페이스이거나 하위타입을 이용하는 것이 아니라 Collection 구현체를 직접 만들어 사용하라고 합니다. + +ex) `AbstractCollection` 을 사용해서 Collection 구현체를 만드는 경우 Iterable용 메서드 2개만 추가하면 기존의 Collection 인터페이스처럼 Stream과 Iterable을 모두 지원할 수 있다고 합니다. 동시에 메모리의 효율성도 살릴 수 있다고 합니다. \ No newline at end of file