자바 8 부터는 기본 메소드로 API에 변화가 생겼다.
#디폴트 메서드
인터페이스에서 미리 메서드 내용을 선언할 수 있다.
public interface test{
void printName();
default void printNameUpperCase(){ // default 메서드는 이렇게 내용을 선언을 할 수 있다.
System.out.println(getName().toUpperCase());
}
String getName();
}
public class DefaultTest implements test{
String name;
@Override
public void printName(){
System.out.println(this.name);
}
@Override
public void getName(){
return this.name;
}
}
//이렇게 default 메서드인 printNameUpperCase는 선언을 안해주어도 컴파일 에러 없이 넘어갈 수 있다.
//하지만, 주의점이 있다. 미리 구현해둔 getName()이 null 익셉션을 반활할 수도 있기 때문에, 문서화를 잘 두어야 한다.
// getName 구현을 잊지 말 것.
//활용
public static void main(String[] args){
Test test = new DefaultTest("name");
test.printName(); //name
test.printNameUpperCase(); //Name
}
public class DefaultTest2 implements test{
void printNameUpperCase();
}
//상속받는 인터페이스에서 다시 재정의할 수 있다.
//만약에 쓰기 싫다고 하면, 그냥 선언만 하고 안쓸 수도 있다.
#같은 default 메서드 명을 가진 인터페이스를 동시에 상속받는다면?
#같은 default 메서드를 가진 인터페이스를 2개 상속받으면, 컴파일 에러가 난다. 어떤걸 상속받는지 모르기 때문
그러면 상속받는 구현체에서 새로 default 메서드를 정의해주면 해결된다.
public class DefalutTest implements DefaultTest, DefaultTest2{
@Override
public void printNameUpperCase(){
//상속받는 구현체에서 새로 default 메서드를 정의해주면 해결된다.
}
}
#순회 하는 메서드
Spliterator, foreach
- foreach
//example)
List <String> name = new ArrayList<>();
name.add("name1");
name.add("name2");
//데이터가 있다고 가정할 때
name.forEach(System.out::println); //으로 활용할 수 있다.
//실제 구현은
for(String str : name){
System.out.println(n);
}
- Spliterator (쪼갤수 있는 기능을 가진 iterator)
Spliterator<String> spliterator = name. spliterator();
while(spliterator .tryAdvance(System.out.println));
//이렇게 활용한다.
Spliterator<String> spliterator = name. spliterator();
Spliterator<String> spliterator2 = spliterator.trySplit();
while(spliterator .tryAdvance(System.out.println));
System.out.println("================");
while(spliterator2 .tryAdvance(System.out.println));
//이렇게 하면 데이터가 반쪼개서 나뉘어서 출력되는 것을 볼 수 있다.
stream?
- count()
element들을 stream 으로 만들어서 functional하게 사용함.
long count = name.stream().map(String::toUpperCase).
filter(s->s.startWith("K"))
.count();
이런식 으로 갯수를 구하거나
- collect
name.stream().map(String::toUpperCase).
filter(s->s.startWith("K"))
.collect(Collectors.toSet());
이렇게 따로 모아 볼 수도 있다.
-
removeIf
name.removeIf(s-> s.startsWith("k"));
-
Comparator 문자열 정렬
name.sort(String::compareTOIgnoreCase);