- 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);
}
쪼갤 수 있는 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
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 안에 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
역순으로 정렬해준다.
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
추가적으로 더 비교할 것이 있을 때 사용한다.
final Comparator<String> compareToIgnoreCase = String::compareToIgnoreCase;
name.sort(compareToIgnoreCase.reversed().thenComparing(...));
null이 있으면 우선순위 / null이 있으면 후순위
인터페이스를 구현한 클래스들에게 편의성(필요한 것만 사용하도록 등등)을 제공하기 위해 추상 클래스를 만들고 구현 클래스들은 추상 클래스를 상속하는 방법으로 구성하였다.
(extends 이용)
추상 클래스가 아닌 인터페이스 자체에서 구현 클래스들에게 바로 편의성을 제공할 수 있다. 또한 클래스에서는 상속에서 자유롭기 때문에 비침투성이 높아진다.
(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 되었다.