Collection
|
|---List (Collection의 구현체)
| |---LinkedList (List의 구현체)
| |---ArrayList (List의 구현체)
| |---Vector (List의 구현체)
| |---Stack (List의 구현체)
|
|---Set (Collection의 구현체)
|---HashSet (Set의 구현체)
int s = new MyCollection<>(Arrays.asList("A", "CA", "DSB", "ASDC", "ASDFE"))
.map(s1 -> s1.length())
.filter(i -> i % 2 == 1)
.size();
public <U> MyCollection<U> map(Function<T, U> function) {...}
MyIterator<String> iter =
new MyCollection<>(Arrays.asList("A", "CA", "DSB", "ASDC", "ASDFE")).iterator();
while(iter.hasNext()) {
String s = iter.next();
...
}
데이터의 연속
System.in / System.out 이것도 스트림
map, filter, forEach 제공
Collection to Stream & Array to Stream
Stream to Collection & Stream to Array
Stream 생성
Stream.generate(r::nextInt)
.limit(10)
.forEach(System.out::println);
// seed: 초기값
// 0, 2, 4, 6 ...
Stream.iterate(0, (i) -> i + 2)
.limit(10)
.forEach(System.out::println);
스트림을 사용하면 연속된 데이터에 대해서 풍부한 고차함수들을 사용하여 강력한 기능을 간결하게 표현할 수 있다!
NPE
이제부터 null을 쓰지 않는 것을 약손하자!
User user2 = getUser();
if(user2 == User.EMPTY) {...}
Optional
if (optionalUser.isPresent()) {
/// do 1
} else {
//// do 2
}
if (optionalUser.isEmpty()) {
// do 2
} else {
// do 1
}
optionalUser.ifPresentOrElse(user -> {
// do 1, not null
}, () -> {
// do 2, null
});
optionalUser.ifPresent(user -> {
// do 1
});