소소한개발팁
Published 2023. 7. 6. 14:57
Java 8 컴퓨터 언어/Java Version
반응형

람다 표현식(Lambda Expressions)

람다 표현식은 익명 함수를 생성하기 위한 간결한 문법을 제공합니다. 함수형 인터페이스를 구현하는 익명 함수로, 메서드를 변수처럼 전달할 수 있게 해줍니다. 예를 들어, 정렬 기준으로 사용되는 Comparator 인터페이스를 람다 표현식으로 표현할 수 있습니다.

 

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

// 람다 표현식을 사용한 정렬
Collections.sort(names, (a, b) -> a.compareTo(b));

 

함수형 인터페이스(Functional Interfaces)

함수형 인터페이스는 단 하나의 추상 메서드를 가진 인터페이스입니다. 람다 표현식과 함께 사용되어 함수형 프로그래밍을 구현할 수 있게 해줍니다. 자바 8에는 java.util.function 패키지에서 다양한 함수형 인터페이스가 제공됩니다. 예를 들어, Consumer, Supplier, Predicate 등이 있습니다.

 

// 정적 메서드 참조
Function<Integer, Integer> square = Math::square;

// 인스턴스 메서드 참조
String str = "Hello";
Function<Integer, Character> charAt = str::charAt;

// 생성자 참조
Supplier<List<String>> listSupplier = ArrayList::new;

 

스트림(Stream)

 

Stream

Stream 스트림은 컬렉션의 요소를 순차적으로 또는 병렬로 처리할 수 있는 기능입니다. 스트림을 사용하면 코드를 간결하고 효율적으로 작성할 수 있습니다. 스트림을 사용하려면 먼저 컬렉션에

devlopjeong12.tistory.com

스트림은 자바 8에서 추가된 데이터 처리를 위한 새로운 추상화입니다. 컬렉션과 배열을 처리하고 변환하며, 함수형 프로그래밍 스타일로 작성할 수 있습니다. 스트림은 중간 연산과 최종 연산을 사용하여 데이터를 다루는데, 중간 연산은 데이터를 변환하거나 조작하고 최종 연산은 결과를 생성합니다.

 

// 스트림을 사용한 데이터 처리
List<String> filteredNames = names.stream()
                                  .filter(name -> name.startsWith("A"))
                                  .collect(Collectors.toList());

 

 

디폴트 메소드(Default Methods) 

자바 8에서는 인터페이스에 디폴트 메서드를 추가할 수 있게 되었습니다. 디폴트 메서드는 인터페이스에 기본적인 구현을 제공하며, 기존 인터페이스의 변경 없이 새로운 기능을 추가할 수 있는 유용한 도구입니다. 예를 들어, List 인터페이스에 forEach() 메서드가 추가되었습니다.

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

// forEach() 디폴트 메서드 사용
names.forEach(System.out::println);

 

 

 

Optional 클래스 

Optional 클래스는 null을 대체하고 NullPointerException을 방지하기 위한 도구입니다. Optional은 값이 존재할 수도 있고, 존재하지 않을 수도 있는 상황에서 사용됩니다. 값이 있는 경우에는 값을 포함하고, 값이 없는 경우에는 비어있음을 나타냅니다.

Optional<String> optionalName = Optional.ofNullable(name);

// 값이 있는 경우에만 처리
optionalName.ifPresent(System.out::println);

 

CompletableFuture

CompletableFuture는 비동기적인 작업을 처리하고 결과를 반환하는 데 사용되는 클래스입니다. 비동기 작업을 효율적으로 처리하기 위해 Future의 확장된 버전으로 도입되었습니다. CompletableFuture는 두 가지 중요한 측면을 제공합니다:

비동기 작업 실행: CompletableFuture.runAsync() 또는 CompletableFuture.supplyAsync() 메서드를 사용하여 비동기 작업을 실행할 수 있습니다. 작업은 별도의 스레드에서 실행되며, CompletableFuture 객체를 통해 결과를 추적하고 조작할 수 있습니다.

작업 조합과 처리: CompletableFuture 객체는 연결된 비동기 작업들을 조합하고 결과를 조작하는데 사용됩니다. thenApply(), thenCompose(), thenCombine() 등의 메서드를 사용하여 작업들을 순차적으로 또는 병렬로 조합할 수 있습니다.

 

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

public class CompletableFutureExample {
    public static void main(String[] args) {
        // 비동기 작업 실행
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
            return "Hello, CompletableFuture!";
        });

        // 작업이 완료된 후 결과 처리
        future.thenAccept(result -> System.out.println("Result: " + result));

        // 메인 스레드가 종료되지 않도록 대기
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }
}

 

리액티브 프로그래밍

리액티브 프로그래밍은 비동기적인 이벤트 기반 프로그래밍 패러다임입니다. 자바에서는 리액티브 프로그래밍을 위해 Reactor 프로젝트와 관련된 API를 사용할 수 있습니다. Reactor API는 스트림 기반의 비동기적인 데이터 처리를 지원합니다. 주요한 요소로는 Flux와 Mono가 있으며, 다음과 같이 사용할 수 있습니다:

Flux0 또는 여러 개의 요소를 비동기적으로 발행할 수 있는 Publisher입니다. 여러 개의 요소를 포함하는 스트림을 나타내며, 비동기 데이터 흐름을 처리하고 조작할 수 있습니다.

 

import reactor.core.publisher.Flux;

public class ReactorExample {
    public static void main(String[] args) {
        // Flux로 비동기적인 데이터 흐름 생성
        Flux<String> flux = Flux.just("apple", "banana", "orange")
            .map(fruit -> fruit.toUpperCase())
            .filter(fruit -> fruit.startsWith("A"));

        // 데이터 흐름을 구독하여 결과 처리
        flux.subscribe(
            fruit -> System.out.println("Received: " + fruit),
            error -> System.err.println("Error: " + error),
            () -> System.out.println("Completed")
        );
    }
}


Mono0 또는 1개의 요소를 비동기적으로 발행할 수 있는 Publisher입니다. 단일 요소를 처리하고 조작할 수 있는 스트림을 나타냅니다.

 

import reactor.core.publisher.Mono;

public class ReactorMonoExample {
    public static void main(String[] args) {
        // Mono로 비동기적인 단일 요소 생성
        Mono<String> mono = Mono.just("Hello, Mono!")
            .map(message -> message.toUpperCase());

        // 단일 요소를 처리하고 결과 출력
        mono.subscribe(
            result -> System.out.println("Result: " + result),
            error -> System.err.println("Error: " + error),
            () -> System.out.println("Completed")
        );
    }
}



Reactor API는 조합, 변환, 필터링 등 다양한 연산을 지원하며, 스트림 기반의 데이터 처리를 효율적으로 수행할 수 있습니다.

 

 

반응형

'컴퓨터 언어 > Java Version' 카테고리의 다른 글

Java 11  (0) 2023.07.09
Java 10  (0) 2023.07.09
Java 9  (0) 2023.07.09
profile

소소한개발팁

@개발자 뱅

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!