자바8 - 인터페이스 default 메소드와 static 메소드 2

현시기얌·2021년 8월 27일
0

JAVA8

목록 보기
8/8

자바8에서 추가한 default 메소드로 인한 API 변화

Iterable의 기본 메소드

  • forEach()
    forEach 안에 Consumer<? super E> action이 들어오기 때문에 메소드 레퍼런스로 줄여서 사용 가능하다.
    public static void main(String[] args) {
        final ArrayList<String> name = new ArrayList<>();

        name.add("aaa");
        name.add("bbb");
        name.add("ccc");
        name.add("ddd");

        name.forEach(System.out::println);
    }
  • spliterator()

    쪼갤 수 있는 iterator, iterator의 hasNext() 대신 tryAdvance()를 사용한다.
    또한 trySplit() 메소드를 이용하면 iterator를 반으로 쪼갤 수 있다. (병렬 처리 할 때 유용하게 사용 가능)

    public static void main(String[] args) {
        final ArrayList<String> name = new ArrayList<>();

        name.add("aaa");
        name.add("bbb");
        name.add("ccc");
        name.add("ddd");

        final Spliterator<String> spliterator = name.spliterator();
        final Spliterator<String> spliterator1 = spliterator.trySplit();
        while(spliterator.tryAdvance(System.out::println));
        System.out.println("====================");
        while(spliterator1.tryAdvance(System.out::println));
    }

출력결과 :

ccc
ddd
====================
aaa
bbb

Collection의 default 메소드

  • stream()

    JAVA8 - Stream 참조

        final ArrayList<String> name = new ArrayList<>();

        name.add("aaa");
        name.add("bbb");
        name.add("ccc");
        name.add("ddd");

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

실행결과 :

AAA
  • removeIf()

    removeIf 안에 Predicate<? super E> filter가 들어와서 해당 조건이 맞으면 지운다.

  final ArrayList<String> name = new ArrayList<>();

        name.add("aaa");
        name.add("bbb");
        name.add("ccc");
        name.add("ddd");

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

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

        name.removeIf(s -> s.startsWith("d"));
        name.forEach(System.out::println);

실행결과 :

aaa
bbb
ccc
  • spliterator()

Comparator의 default 메소드 및 static 메소드

  • reversed()

    역순으로 정렬해준다.

    public static void main(String[] args) {
        final ArrayList<String> name = new ArrayList<>();

        name.add("aaa");
        name.add("bbb");
        name.add("ccc");
        name.add("ddd");

        name.sort(String::compareToIgnoreCase);
        name.forEach(System.out::println);

        System.out.println("====================");

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

실행결과 :

aaa
bbb
ccc
ddd
====================
ddd
ccc
bbb
aaa
  • thenComparing()

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

        final Comparator<String> compareToIgnoreCase = String::compareToIgnoreCase;
        name.sort(compareToIgnoreCase.reversed().thenComparing(...));
  • static reverseOrder() / naturalOrder()
  • static nullsFirst() / nullsLast()

    null이 있으면 우선순위 / null이 있으면 후순위

  • static comparing()

API 변화

자바8 이전

인터페이스를 구현한 클래스들에게 편의성(필요한 것만 사용하도록 등등)을 제공하기 위해 추상 클래스를 만들고 구현 클래스들은 추상 클래스를 상속하는 방법으로 구성하였다.
(extends 이용)

자바8 이후

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

@Deprecated
public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer {

	/**
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void configurePathMatch(PathMatchConfigurer configurer) {
	}

	/**
	 * {@inheritDoc}
	 * <p>This implementation is empty.
	 */
	@Override
	public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
	}
        ....
        ....
}

때문에 Spring 5.0 부터는 위와 같이 추상 클래스들이 자바8의 default 메소드 의해 필요가 없어졌으므로 Deprecated 되었다.

profile
현시깁니다

0개의 댓글

관련 채용 정보