// 데이터 준비
List<String> fruits = new ArrayList<>();
fruits.add("apple");
fruits.add("banana");
fruits.add("grape");
fruits.add("melon");
// forEach 문을 이용한 출력 순회
for (String n : fruits) {
System.out.println(n);
}
// forEach문, 람다를 이용한 출력 순회
fruits.forEach(x -> System.out.println(x));
// forEach문, 메서드 레퍼런스를 이용한 출력 순회
fruits.forEach(System.out::println);
Spliterator<String> spliterator = fruits.spliterator();
while(spliterator.tryAdvance(System.out::println));
/** 결과 값
* apple
* banana
* grape
* melon
*/
Spliterator
tryAdvance를 필수로 구현해야하는 interface
Spliterator<String> spliteratorOne = fruits.spliterator();
Spliterator<String> spliteratorTwo = spliteratorOne.trySplit();
while (spliteratorOne.tryAdvance(System.out::println));
System.out.println();
while (spliteratorTwo.tryAdvance(System.out::println));
/** 결과 값
* grape
* melon
*
* apple
* banana
*/
final Set<String> set = fruits.stream().map(String::toUpperCase)
.filter(s -> s.startsWith("A"))
.collect(Collectors.toSet());
set.forEach(System.out::println);
/** 결과 값
*
* APPLE
* */
Predicate
어떤 인자값을 하나 받아서 true/false를 리턴해주는 함수 인터페이스
not, or, and를 사용해 조합도 가능
fruits.removeIf(s -> s.startsWith("b"));
fruits.forEach(System.out::println);
/* 결과 값
*
* apple
* grape
* melon
* */
fruits.parallelStream().forEach(System.out::println);
/* 결과 값
*
* grape
* melon
* banana
* apple
* */
final Comparator<String> comparator = String::compareToIgnoreCase;
fruits.sort(comparator.reversed());
fruits.forEach(System.out::println);
/* 결과 값
*
* melon
* grape
* banana
* apple
* */
thenComparing()
인터페이스를 구현한 클래스들에게 편의성을 제공하기 위해 추상 클래스를 만들고,
구현 클래스들은 추상 클래스를 상속하는 방법으로 구성하였다.
추상 클래스가 아닌 인터페이스 자체에서 구현 클래스들에게 바로 편의성을 제공할 수 있다.
또한 클래스에서는 상속에서 자유롭기 때문에 비침투성이 높아진다.