자바 8 API의 기본 메소드와 스태틱 메소드
List 변수 생성
public class App {
public static void main(String[] args) {
List<String> name = new ArrayList<>();
name.add("TheJava8");
name.add("spring");
name.add("toby");
name.add("dev");
}
}
foreach : for문 생각하면 됨. 그런데 거기에 함수형 인터페이스를 얹은
public class App {
public static void main(String[] args) {
List<String> name = new ArrayList<>();
name.add("TheJava8");
name.add("spring");
name.add("toby");
name.add("dev");
// s에 괄호는 생략 가능
name.forEach((s) -> {
System.out.println(s);
});
// 위의 코드를 아래와 같이 변경 가능 : 메소드 레퍼런스!
name.forEach(System.out::println);
}
}
iterator 활용
public class App {
public static void main(String[] args) {
List<String> name = new ArrayList<>();
name.add("TheJava8");
name.add("spring");
name.add("toby");
name.add("dev");
// 기존의 iterator 활용
Iterator<String> iterator = name.iterator();
while( iterator.hasNext() ){
System.out.println( iterator.next() );
}
// 자바8에서의 iterator
// iterator와 비슷하지만, 쪼갤 수 있는 기능을 가지고 있는 iterator
Spliterator<String> spliterator = name.spliterator();
while( spliterator.tryAdvance(System.out::println) );
// trySplit을 사용하면 반으로 쪼갠다.
Spliterator<String> newSpliterator = name.spliterator();
// 기존의 newSpliterator는 반으로 나눠지고, 나머지 반은 newSpliterator2로 간다.
Spliterator<String> newSpliterator2 = newSpliterator.trySplit();
while( newSpliterator.tryAdvance(System.out::println) );
while( newSpliterator2.tryAdvance(System.out::println) );
}
}
stream : 내부적으로 Spliterator를 사용하고 있음
public class App {
public static void main(String[] args) {
List<String> name = new ArrayList<>();
name.add("TheJava8");
name.add("spring");
name.add("toby");
name.add("dev");
long k = name.stream()
.map(String::toUpperCase) // map : 요소 변환 -> spring => SPRING
.filter(s -> s.startsWith("S")) // filter : 조건에 의한 필터 -> SPRING만 true
.count(); // count : .size()
// 1 출력
System.out.println(k);
List<String> list = name.stream()
.map(String::toUpperCase) // map : 요소 변환 -> spring => SPRING
.filter(s -> s.startsWith("S")) // filter : 조건에 의한 필터 -> SPRING만 true
.collect(Collectors.toList()); // collect : 특정 대상으로 변환 -> List, Set ...
// [SPRING] 출력
System.out.println(list.toString());
}
}
removeIf : 조건에 의한 삭제
public class App {
public static void main(String[] args) {
List<String> name = new ArrayList<>();
name.add("TheJava8");
name.add("spring");
name.add("toby");
name.add("dev");
name.removeIf(s -> s.startsWith("s")); // spring 요소 삭제
name.forEach(System.out::println);
}
}
Comparator : 함수형 인터페이스를 이용한 정렬
public class App {
public static void main(String[] args) {
List<String> name = new ArrayList<>();
name.add("TheJava8");
name.add("spring");
name.add("toby");
name.add("dev");
// 오름차순 정렬
name.sort(String::compareToIgnoreCase);
name.forEach(System.out::println);
// 내림차순 정렬 : .reversed()
Comparator<String> compareToIgnoreCase = String::compareToIgnoreCase;
name.sort(compareToIgnoreCase.reversed());
name.forEach(System.out::println);
// thenComparing -> 정렬 후 또 다른 조건으로 정렬하고 싶을 경우
name.sort(compareToIgnoreCase.reversed().thenComparing(compareToIgnoreCase.reversed()));
name.forEach(System.out::println);
}
}
Java8 이전
인터페이스 생성 -> a, b, c 함수 선언
인터페이스를 구현하는 추상 클래스 (abstract class) 생성 -> a, b, c 함수 구현
이유 : 추상 클래스를 상속 받아 구현하는 클래스에서 a, b, c 함수 중에 원하는 것만 골라서 구현할 수 있도록 편의성 제공
(필요 없다면 구현 X)
Java8 이후
인터페이스에서 기본(default) 메서드를 사용해서 a, b, c 함수를 구현해 놓고
추상 클래스 없이, 인터페이스를 직접 implements하는 방식
ex) WebMvcConfigurer.class, WebMvcConfigurerAdapter.class
자바8 이전에는 WebMvcConfigurer에서 정의하고 WebMvcConfigurerAdapter에서 구현하였으나
WebMvcConfigurer에서 default 메서드로 변경된 후 WebMvcConfigurerAdapter가 Deprecated되었다.
출처 :
인프런 강의 - 더 자바, Java 8 (백기선)
https://www.inflearn.com/course/the-java-java8