본문 바로가기
Computer Sience/Java

[JAVA8] 자바 8 API의 기본 메소드와 스태틱 메소드

by 제우제우 2024. 10. 2.

목차 

  • Iterable 기본 메소드 
  • Collection 기본 메소드 
  • Comparator 기본 메소드 및 스태틱 메소드 
  • 참고 자료

Iterable 기본 메소드 

forEach()

public interface Iterable<T> {
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }
}

 

forEach() - 활용

public class Test {
    public static void main(String[] args) {
        List<String> name = new ArrayList<>();
        name.add("keesun");
        name.add("whiteship");
        name.add("toby");
        name.add("foo");

        // forEach - 람다 표현식 
        name.forEach(s -> {
            System.out.println(s);
        });
        // 메소드 래퍼런스 
        name.forEach(System.out::println);
    }
}

 

spliterator()

public class Test {
    public static void main(String[] args) {
        List<String> name = new ArrayList<>();
        name.add("keesun");
        name.add("whiteship");
        name.add("toby");
        name.add("foo");

        Spliterator<String> spliterator1 = name.spliterator();
        Spliterator<String> spliterator2 = spliterator1.trySplit();

        while (spliterator1.tryAdvance(System.out::println)); 
        System.out.println("==================");
        while (spliterator2.tryAdvance(System.out::println));
    }
}
/* 출력 결과 
toby
foo
==================
keesun
whiteship
*/

Collection의 기본 메소드

stream() / parallelStream()

// Collection 인터페이스 

// default 메소드 stream()
default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
}

// default 메소드 parallelStream()	
default Stream<E> parallelStream() {
    return StreamSupport.stream(spliterator(), true);
}

 

stream() - 활용

List<String> name = new ArrayList<>();
name.add("keesun");
name.add("whiteship");
name.add("toby");
name.add("foo");
    
name.stream()
    .map(String::toUpperCase)         // Function 인터페이스 메소드 래퍼런스 
    .filter(s -> s.startsWith("K"))
    .forEach(System.out::println);
    
// 출력 
KEESUN

 

 

removeIf(Predicate)

default boolean removeIf(Predicate<? super E> filter) {
    Objects.requireNonNull(filter);
    boolean removed = false;
    final Iterator<E> each = iterator();
    while (each.hasNext()) {
        if (filter.test(each.next())) {
            each.remove();
            removed = true;
        }
    }
    return removed;
}

 

removeIf(Predicate) - 활용

List<String> name = new ArrayList<>();
name.add("keesun");
name.add("whiteship");
name.add("toby");
name.add("foo");

name.removeIf(s -> s.length() == 3);
System.out.println(name.size());

/*
길이가 3인 foo 삭제
총 사이즈 = 3 출력 
*/

Comparator의 기본 메소드 및 스태틱 메소드

  • reversed()
  • thenComparing()
  • static reverseOrder() / naturalOrder()
  • static nullsFirst() / nullsLast()
  • static comparing()

reversed()

List<Integer> numbers = Arrays.asList(1, 4, 3, 2);
numbers.sort(Comparator.naturalOrder().reversed());
System.out.println(numbers);  // 출력: [4, 3, 2, 1] (내림차순 정렬)

 

기존의 비교 순서를 반대로 뒤집는다.

 

thenComparing()

List<Person> people = Arrays.asList(
    new Person("Alice", 30),
    new Person("Bob", 30),
    new Person("Charlie", 25)
);
people.sort(Comparator.comparing(Person::getAge).thenComparing(Person::getName));
people.forEach(p -> System.out.println(p.getName() + " " + p.getAge()));

// 출력: Charlie 25, Alice 30, Bob 30

 

첫 번째 비교가 같을 때, 두 번째 기준으로 정렬

 

static reverseOrder()

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.sort(Comparator.reverseOrder());
System.out.println(names);  // 출력: [Charlie, Bob, Alice] (내림차순 정렬)

 

자연 순서(오름차순)의 반대인 내림차순으로 정렬

 

static naturalOrder()

List<Integer> numbers = Arrays.asList(3, 1, 4, 2);
numbers.sort(Comparator.naturalOrder());
System.out.println(numbers);  // 출력: [1, 2, 3, 4] (오름차순 정렬)

 

기본 정렬 순서(오름차순)로 정렬

 

static comparing()

List<Person> people = Arrays.asList(
    new Person("Alice", 30),
    new Person("Bob", 25),
    new Person("Charlie", 35)
);
people.sort(Comparator.comparing(Person::getAge));  // 나이 기준으로 정렬
people.forEach(p -> System.out.println(p.getName() + " " + p.getAge()));
// 출력: Bob 25, Alice 30, Charlie 35

특정 속성을 기준으로 정렬할 수 있는 Comparator를 생성

예시: Person 객체의 나이를 기준으로 정렬.

 

static nullsFirst()

List<String> names = Arrays.asList("Bob", null, "Alice", "Charlie");
names.sort(Comparator.nullsFirst(Comparator.naturalOrder()));
System.out.println(names);  // 출력: [null, Alice, Bob, Charlie]

 

null 값을 우선 정렬하고, 나머지를 자연 순서로 정렬

 

static nullsLast()

List<String> names = Arrays.asList("Bob", null, "Alice", "Charlie");
names.sort(Comparator.nullsLast(Comparator.naturalOrder()));
System.out.println(names);  // 출력: [Alice, Bob, Charlie, null]

 

null 값을 마지막에 정렬하고, 나머지를 자연 순서로 정렬


참고 자료 

인프런 백기선님 더 자바, Java 8

 

더 자바, Java 8 강의 | 백기선 - 인프런

백기선 | 자바 8에 추가된 기능들은 자바가 제공하는 API는 물론이고 스프링 같은 제 3의 라이브러리 및 프레임워크에서도 널리 사용되고 있습니다. 이 시대의 자바 개발자라면 반드시 알아야 합

www.inflearn.com

 

자바 8 공식 문서