>  기사  >  Java  >  항목 스트림에서 부작용이 없는 기능을 우선시합니다.

항목 스트림에서 부작용이 없는 기능을 우선시합니다.

WBOY
WBOY원래의
2024-08-08 16:46:52706검색

Item  Dê preferência às funções sem efeitos colaterais nas streams

스트림 사용 소개:

  • 신규 사용자는 스트림 파이프라인에서 계산을 표현하는 데 어려움을 겪을 수 있습니다.
  • 스트림은 함수형 프로그래밍을 기반으로 하며 표현력, 속도 및 병렬화를 제공합니다.

계산 구조:

  • 순수 함수를 사용한 일련의 변환으로 구조 계산을 수행합니다.
  • 순수 함수는 입력에만 의존하며 상태를 변경하지 않습니다.

부작용:

  • 스트림 작업에 전달된 함수의 부작용을 방지하세요.
  • 외부 상태를 변경하는 forEach를 부적절하게 사용하는 것은 "악취"입니다.

예제 1: 부작용이 있는 코드

Map<String, Long> freq = new HashMap<>();
try (Stream<String> words = new Scanner(file).tokens()) {
    words.forEach(word -> {
        freq.merge(word.toLowerCase(), 1L, Long::sum);
    });
}

문제: 이 코드는 forEach를 사용하여 외부 상태(freq)를 수정합니다. 반복적이며 스트림을 활용하지 않습니다.

예제 2: 부작용이 없는 코드

Map<String, Long> freq;
try (Stream<String> words = new Scanner(file).tokens()) {
    freq = words.collect(Collectors.groupingBy(String::toLowerCase, Collectors.counting()));
}

해결책: Collectors.groupingBy 수집기를 사용하여 외부 상태를 변경하지 않고 빈도 테이블을 생성합니다. 더 짧고, 더 명확하고, 더 효율적입니다.

스트림 API 사용:

  • 반복 루프를 모방하는 코드는 스트림을 활용하지 않습니다.
  • 더 효율적이고 읽기 쉬운 작업을 위해 컬렉터를 사용하세요.

수집가:

  • 결과 수집을 목록, 세트 등의 컬렉션으로 단순화하세요.
  • Collectors.toList(), Collectors.toSet(), Collectors.toCollection(collectionFactory).

예시 3: 가장 빈번한 10개의 단어 목록 추출

List<String> topTen = freq.entrySet().stream()
    .sorted(Map.Entry.<String, Long>comparingByValue().reversed())
    .limit(10)
    .map(Map.Entry::getKey)
    .collect(Collectors.toList());

설명:

  • 빈도 맵 항목을 값의 내림차순으로 정렬합니다.
  • 스트림을 10단어로 제한합니다.
  • 목록에서 가장 자주 사용되는 단어를 수집합니다.

Collectors API의 복잡성:

  • API에는 39가지 메서드가 있지만 대부분은 고급 용도로 사용됩니다.
  • 컬렉터를 사용하여 지도(toMap, groupingBy)를 생성할 수 있습니다.

지도 및 수집 전략:

  • 고유한 키-값에 대한 toMap(keyMapper, valueMapper).
  • 병합 기능을 활용한 주요 충돌 처리 전략
  • groupingBy를 사용하여 분류자 기능을 기반으로 요소를 카테고리로 그룹화합니다.

예 4: 병합 기능이 있는 toMap 사용

Map<String, Long> freq;
try (Stream<String> words = new Scanner(file).tokens()) {
    freq = words.collect(Collectors.toMap(
        String::toLowerCase, 
        word -> 1L, 
        Long::sum
    ));
}

설명:

  • toMap은 단어를 빈도에 따라 매핑합니다.
  • 병합 기능(Long::sum)은 빈도를 합산하여 주요 충돌을 처리합니다.

예시 5: 아티스트별로 앨범을 그룹화하고 베스트셀러 앨범 찾기

Map<Artist, Album> topAlbums = albums.stream()
    .collect(Collectors.toMap(
        Album::getArtist,
        Function.identity(),
        BinaryOperator.maxBy(Comparator.comparing(Album::sales))
    ));

설명:

  • toMap은 아티스트를 베스트 셀러 앨범으로 매핑합니다.
  • BinaryOperator.maxBy는 각 아티스트의 베스트 셀러 앨범을 결정합니다.

문자열 컬렉션:
Collectors.joining을 사용하여 문자열을 선택적 구분 기호로 연결합니다.

예 6: 구분 기호로 문자열 연결

String result = Stream.of("came", "saw", "conquered")
    .collect(Collectors.joining(", ", "[", "]"));

설명:

  • Collectors.joining은 문자열을 구분 기호, 접두사, 접미사로 쉼표로 연결합니다.
  • 결과: [왔다, 보았다, 정복했다].

결론:

  • 스트림의 본질은 부작용 없는 기능에 있습니다.
  • forEach는 결과 보고에만 사용해야 합니다.
  • 스트림을 효과적으로 활용하기 위해서는 컬렉터에 대한 지식이 필수입니다.

위 내용은 항목 스트림에서 부작용이 없는 기능을 우선시합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.