[Java 8] Java 8 API의 default 메소드와 static 메소드

홍정완·2022년 6월 14일
0

Java

목록 보기
6/25
post-thumbnail
  • 자바 8에서 추가한 default 메소드로 인한 API 변화



// 데이터 준비

List<String> fruits = new ArrayList<>();
fruits.add("apple");
fruits.add("banana");
fruits.add("grape");
fruits.add("melon");



Iterable의 default 메소드


forEach()


// forEach 문을 이용한 출력 순회
for (String n : fruits) {
	System.out.println(n);
}


// forEach문, 람다를 이용한 출력 순회
fruits.forEach(x -> System.out.println(x));


// forEach문, 메서드 레퍼런스를 이용한 출력 순회
fruits.forEach(System.out::println);



spliterator()


Spliterator<String> spliterator = fruits.spliterator();

while(spliterator.tryAdvance(System.out::println));

/** 결과 값
 *  apple
 *  banana
 *  grape
 *  melon
 */ 
  • Spliterator

    • tryAdvance를 필수로 구현해야하는 interface

      • 요소가 남아있으면 계속해서 수행
      • 있으면 true, 없으면 false 반환



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
 */ 
  • trySplit : spliterator를 분할 할 수있는 경우, 반으로 나눠서 반환



Collection의 default 메소드


stream()


final Set<String> set = fruits.stream().map(String::toUpperCase)
                .filter(s -> s.startsWith("A"))
                .collect(Collectors.toSet());

set.forEach(System.out::println);

/** 결과 값
 *
 *  APPLE
 * */

removeIf(Predicate)


  • 주어진 조건을 만족하는 해당 컬렉션의 모든 요소를 제거

  • Predicate

    • 어떤 인자값을 하나 받아서 true/false를 리턴해주는 함수 인터페이스

    • not, or, and를 사용해 조합도 가능


fruits.removeIf(s -> s.startsWith("b"));

fruits.forEach(System.out::println);

/* 결과 값
*
* apple
* grape
* melon
* */

parallelStream()


  • 순서를 보장받는 것이 중요하지 않을 때만 사용하자.

fruits.parallelStream().forEach(System.out::println);

/* 결과 값
*
* grape
* melon
* banana
* apple
* */



Comparator의 default 메소드 및 static 메소드


reversed()


  • 역순으로 정렬

final Comparator<String> comparator = String::compareToIgnoreCase;
        
fruits.sort(comparator.reversed());
fruits.forEach(System.out::println);

/* 결과 값
*
* melon
* grape
* banana
* apple
* */



  • thenComparing()

    • 추가적으로 더 비교할 것이 있을 때 사용

  • static reverseOrder() / naturalOrder()

  • static nullsFirst() / nullsLast()

  • static comparing()



API 변화 ✅


자바 8 이전


  • 인터페이스를 구현한 클래스들에게 편의성을 제공하기 위해 추상 클래스를 만들고,
    구현 클래스들은 추상 클래스를 상속하는 방법으로 구성하였다.

    • (extends 사용)


자바 8 이후


  • 추상 클래스가 아닌 인터페이스 자체에서 구현 클래스들에게 바로 편의성을 제공할 수 있다.
    또한 클래스에서는 상속에서 자유롭기 때문에 비침투성이 높아진다.

    • (implements 사용)

profile
습관이 전부다.

0개의 댓글