Item 47. Return Collection or Stream
๋ฐํ ํ์ ์ผ๋ก๋ ์คํธ๋ฆผ๋ณด๋ค ์ปฌ๋ ์ ์ด ๋ซ๋ค
๋ฉ์๋ ๋ฐํ ํ์ ์ผ๋ก๋ ์ฃผ๋ก ์ปฌ๋ ์ ์ธํฐํ์ด์ค๋ Iterable, ํน์ ๋ฐฐ์ด์ด ์ฌ์ฉ๋๋ค. ์คํธ๋ฆผ ํ์ ์ญ์ ๋ฐํํ ์ ์์ง๋ง ๋ฐํ ๋ ์คํธ๋ฆผ์ for-each๋ก ๋ฐ๋ณตํ ์ ์์ด ๊ถ์ฅํ์ง ์๋๋ค.(๋ฉ์๋ ์ฐธ์กฐ + ํ๋ณํ์ ์ฌ์ฉํ๋ฉด ๋๊ธด ํ์ง๋ง, ๋นํจ์จ์ )
class Example {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
// ์ปฌ๋ ์
์ธํฐํ์ด์ค ๋ฐํ
Collection<String> collection = list;
for (String s : collection) {
System.out.println(s);
}
// Iterable ๋ฐํ
Iterable<String> iterable = list;
for (String s : iterable) {
System.out.println(s);
}
// ๋ฐฐ์ด ๋ฐํ
String[] array = list.toArray(new String[0]);
for (String s : array) {
System.out.println(s);
}
// ์คํธ๋ฆผ ๋ฐํ
Stream<String> stream = list.stream();
for (String s : stream) { // ์ปดํ์ผ ์๋ฌ
System.out.println(s);
}
for (String s : (Iterable<String>) stream::iterator) { // ํ๋ณํ + ๋ฉ์๋ ์ฐธ์กฐ, ๋นํจ์จ์
System.out.println(s);
}
for (String s : iterableOf(stream)) { // ๋ฉ์๋๋ฅผ ๋ง๋ค์ด ์ฌ์ฉ
System.out.println(s);
}
}
public static <E> Iterable<E> iterableOf(Stream<E> stream) {
return stream::iterator;
}
}
๋ง์ฝ ์ค์ง ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์๋ง ์ฐ์ด๋ ๊ฒฝ์ฐ๋ผ๋ฉด ์คํธ๋ฆผ์ ๋ฐํํด๋ ๋์ง๋ง, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ Iterable์ ๋ฐํํ๋ ๊ฒ์ด ์ข๋ค.
Collection ์ธํฐํ์ด์ค
Collection ์ธํฐํ์ด์ค๋ Iterable์ ํ์ ์ธํฐํ์ด์ค์ด๋ฉด์ stream ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค. ๋๋ฌธ์ Collection ์ธํฐํ์ด์ค๋ฅผ ๋ฐํํ๋ฉด ์ปฌ๋ ์ ์ ๋ฐ๋ณตํ ์ ์๊ณ , ์คํธ๋ฆผ์ผ๋ก๋ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐํ ํ์ ์ผ๋ก๋ Collection ์ธํฐํ์ด์ค๊ฐ ์ต์ ์ด๋ผ๊ณ ํ ์ ์๋ค.
๋ง์ฝ ์ํ์ค์ ํฌ๊ธฐ๊ฐ ํฌ์ง ์๋ค๋ฉด ArrayList
๋ HashSet
๊ฐ์ ํ์ค ์ปฌ๋ ์
๊ตฌํ์ฒด๋ฅผ ๋ฐํํด๋ ์ข์ง๋ง, ํฐ ์ํ์ค์ธ ๊ฒฝ์ฐ Collection ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค๋ฅผ ๋ฐํํ๋ ๊ฒ์ ์ข์ง ์๋ค.
์๋ฅผ ๋ค์ด ๋ฉฑ์งํฉ์ ๊ตฌํ๋ ๋ฉ์๋์ ๊ฒฝ์ฐ 2^n๊ฐ์ ์์๋ฅผ ๊ฐ์ง Collection์ ๋ฐํํ๊ฒ ๋๋๋ฐ, ์ด ๊ฒฝ์ฐ ArrayList๋ฅผ ๋ฐํํ๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ๊ฒ ๋๋ค.
์ ์ฉ ์ปฌ๋ ์
๋ง์ฝ ๋ฐํํ๋ ์ปฌ๋ ์
์ด ํฌ์ง๋ง ํํ์ ๊ฐ๊ฒฐํ๊ฒ ํ ์ ์๋ค๋ฉด ์ ์ฉ ์ปฌ๋ ์
์ ๋ง๋ค์ด ๋ฐํํ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด๋ค.
AbstractList
๋ฅผ ์ด์ฉํ์ฌ ์ ์ฉ ์ปฌ๋ ์
์ ๋ง๋ ์์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
class PowerSet {
public static final <E> Collection<Set<E>> of(Set<E> s) {
List<E> src = new ArrayList<>(s);
if (src.size() > 30) {
throw new IllegalArgumentException("์งํฉ์ ์์๊ฐ ๋๋ฌด ๋ง์ต๋๋ค(์ต๋ 30๊ฐ).: " + s);
}
return new AbstractList<Set<E>>() {
@Override
public int size() {
return 1 << src.size(); // 2์ src.size() ์ ๊ณฑ
}
@Override
public boolean contains(Object o) {
return o instanceof Set && src.containsAll((Set) o);
}
@Override
public Set<E> get(int index) {
Set<E> result = new HashSet<>();
for (int i = 0; index != 0; i++, index >>= 1) {
if ((index & 1) == 1) {
result.add(src.get(i));
}
}
return result;
}
};
}
}
๋ฉฑ์งํฉ์ ๊ตฌํด์ผํ๋ ๊ฒฝ์ฐ ํญ์ ๋ชจ๋ ์ปฌ๋ ์ ์์๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์ฌ๋ฆฌ๋ ๊ฒ๋ณด๋จ, ํ์ํ ์์ ์ ์์๋ฅผ ๋ง๋ค์ด ๋ฐํํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ณ ์๋ค.
๊ฒฐ๋ก
๋ชจ๋ ๊ฒฝ์ฐ์ ์ปฌ๋ ์ ์ ๋ฐํํ๋ ๊ฒ์ด ์ต์ ์ ์๋์ง๋ง, ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐํ ๋ฐ์ ํด๋ผ์ด์ธํธ๋ ์ด๋ฅผ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ์ง ๋ชจ๋ฅธ๋ค. ๋๋ฌธ์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ, ์คํธ๋ฆผ๊ณผ ๋ฐ๋ณต์ ๋ชจ๋ ์ฌ์ฉํ ์ ์๋ Collection ์ธํฐํ์ด์ค๋ฅผ ๋ฐํํ๋ ๊ฒ์ด ์ข๋ค.
Last updated
Was this helpful?