데이터 처리를위한 Java 스트림 API에 대한 실용 가이드
Java Streams API는 컬렉션, 어레이 또는 공장에서 스트림을 만들고 필터, 맵 및 플랫 맵과 같은 중간 작업을 적용하여 데이터가 게으르게 변환하기 위해 중간 작업을 적용한 다음, 수집, 카운트 또는 FindFirst와 같은 터미널 작업을 사용하여 결과를 피하고, 스트림 재사용을 피하고, 그룹화를위한 수집 또는 요약을 포함하여 유사한 스트림을 사용하여 유사한 스트림을 사용하여 유사한 스트림을 사용합니다. 필터링.
Java Streams API는 Java 8에 도입 된 강력한 도구로 개발자가 데이터 시퀀스를 처리하는 방법에 혁명을 일으킨다. 컬렉션, 어레이 및 기타 데이터 소스에서 기능 스타일 작업을 수행하여 코드를보다 읽기 쉽고 간결하며 종종 병렬화하기 쉽습니다. 사용자 목록을 필터링하거나 데이터 변환 또는 값을 집계하든 스트림은 작업을 완료 할 수있는 깨끗하고 효율적인 방법을 제공합니다.

다음은 실제 데이터 처리 시나리오에서 Streams API를 효과적으로 사용하는 데 도움이되는 실용 가이드입니다.
1. 스트림 생성 및 이해
스트림은 데이터 구조가 아니며 요소를 저장하지 않습니다. 대신, 운영 파이프 라인을 통해 소스 (수집 또는 배열과 같은)의 데이터를 전달합니다.

여러 가지 방법으로 스트림을 만들 수 있습니다.
// 컬렉션에서 list <string> names = arrays.aslist ( "Alice", "Bob", "Charlie"); 스트림 <string> namestream = names.stream (); // 배열에서 int [] 숫자 = {1, 2, 3, 4, 5}; intstream numberstream = arrays.stream (숫자); // 정적 공장 방법에서 스트림 <string> staticstream = stream.of ( "Apple", "Banana", "Cherry"); // 무한 스트림 (주의해서 사용) 스트림 <integer> infinitestream = stream.iterate (0, n-> n 2);
중요 : 사용 후 스트림이 소비됩니다.
collect()
또는forEach()
와 같은 작업이 호출되면 스트림을 재사용 할 수 없습니다.
2. 일반적인 중간 작업
중간 작업은 새 스트림을 반환하여 메소드 체인을 허용합니다. 그들은 게으르다 - 터미널 작동이 호출 될 때까지 실행되지 않는다.
-
filter(Predicate)
- 조건과 일치하는 요소를 선택합니다 -
map(Function)
- 각 요소를 변환합니다 -
flatMap(Function)
- 평평한 중첩 구조 -
distinct()
- 복제를 제거합니다 -
sorted()
- 정렬 요소 -
limit(n)
/skip(n)
- 제어 크기
예 : 사용자 이름을 필터링 및 매핑합니다
<string> longnamesuppercase = user.stream () .filter (user-> user.getName (). longth ()> 5) .map (user :: getName) .map (String :: ToupperCase) .별개의() .collect (collectors.tolist ());
이 체인은 사용자에게 긴 이름, 추출 및 이름을 대문자로 변환하고 중복을 제거합니다.
flatMap
사용하여 중첩 된 데이터를 평평하게하십시오.
List <list <string >> listofLists = arrays.aslist ( Arrays.aslist ( "A", "B"), Arrays.aslist ( "C", "D") ); list <string> flatlist = listofLists.stream () .flatmap (list :: stream) .collect (collectors.tolist ()); // [ "a", "b", "c", "d"]]]
3. 터미널 작동 : 결과를 얻습니다
터미널 작업은 실제 처리를 트리거하고 결과 또는 부작용을 생성합니다. 그 후 스트림이 닫힙니다.
일반적인 터미널 작업 :
-
collect(Collector)
- 결과를 목록,지도 등으로 수집하십시오. -
forEach(Consumer)
- 각 요소에 대한 작업을 수행합니다 -
count()
- 요소 수를 얻습니다 -
anyMatch()
,allMatch()
,noneMatch()
- 부울 점검 -
findFirst()
,findAny()
- 선택적 결과를 얻습니다 -
reduce()
- 요소를 단일 값으로 결합하십시오
예 :
// 활성 사용자를 계산하십시오 long activecount = user.stream () .filter (user :: isactive) .세다(); // 사용자가 관리자인지 확인하십시오 부울 hasadmin = user.stream () .AnyMatch (user-> user.getRole (). Equals ( "admin"); // 총 급여로 줄입니다 Double TotalSalary = Employees.stream () .maptodouble (직원 :: getsalary) .reduce (0.0, double :: sum);
nulls를 피하려면
findFirst()
와 함께Optional
사용하십시오.옵션 <user> firstAdmin = user.stream () .filter (u-> u.getRole (). Equals ( "admin")) .findFirst ();
4. 수집가와의 결과 수집
Collectors
유틸리티 클래스는 스트림 출력을 수집하는 강력한 방법을 제공합니다.
-
toList()
,toSet()
,toMap()
-
groupingBy()
- 분류기 별 그룹 요소 -
partitioningBy()
- True/False 그룹으로 나뉩니다 -
summarizingInt/Long/Double()
- 요약 통계를 얻으십시오
역할 별 그룹 사용자 :
Map <String, List <User>> userSyRole = user.stream () .collect (Collectors.groupingby (user :: getrole));
성인과 미성년자로의 분할 :
Map <boolean, list <user>> partitionedByage = user.stream () .Collect (Collectors.PartitioningBy (u-> u.getage ()> = 18);
요약 통계 받기 :
intsummarystatistics agestats = user.stream () .collect (Collectors.summarizingInt (user :: getage)); System.out.println ( "Avg Age :"agestats.getaverage ()); System.out.println ( "Max Age :"agestats.getmax ());
5. 성능 팁 및 모범 사례
평행 스트림을 현명하게 사용하십시오 :
parallelStream()
은 대형 데이터 세트 속도를 높일 수 있지만 부작용과 스레드 안전성을 조심하십시오.List <string> result = largelist.parallelstream () .map (this :: 값 비싼 점) .filter (Objects :: Nonnull) .collect (collectors.tolist ());
돌연변이 가능한 감소를 피하십시오 :
Collectors.toList()
와 같은 불변forEach
수집가를 선호합니다.limit()
및anyMatch()
와 같은 단락 작업은 대형 또는 무한 스트림의 성능을 향상시킬 수 있습니다.체인 작업 효율적으로 :
map()
와 같은 고가의 작업 전에 데이터 크기를 줄이기 위해filter()
조기에 배치하십시오.
6. 피하는 일반적인 함정
스트림을 재사용하려고 :
스트림 <string> stream = list.stream (); stream.foreach (System.out :: println); // 좋아요 stream.foreach (System.out :: println); // INLEGALSTATEException!
Optional
반품 무시 :findFirst()
또는findAny()
항상 확인하거나 안전하게 풀립니다.간단한 루프에 스트림 사용 : 스트림을 과도하게 사용하지 마십시오. 사소한 작업에는 간단한
for
가 더 명확합니다.과도한 체인 : 변수 또는 도우미 방법으로 복잡한 파이프 라인을 읽을 수있는 단계로 나눕니다.
Streams API는 Java의 데이터 처리를보다 표현적이고 기능적으로 만듭니다. 필터링, 변환 및 감소 작업을 결합하여 특히 컬렉션을 다룰 때 클리너,보다 관리 가능한 코드를 작성할 수 있습니다.
그냥 기억하십시오 : 스트림은 어떻게 해야하는지 에 관한 것입니다. 불변성을 받아들이고 부작용을 피하고 API가 반복을 처리하게하십시오.
기본적으로, 일단 중간 대 터미널 작업을 수행하고 결과를 효과적으로 수집하는 방법을 얻으면 대부분의 일상 데이터 작업이 훨씬 부드럽습니다.
위 내용은 데이터 처리를위한 Java 스트림 API에 대한 실용 가이드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undress AI Tool
무료로 이미지를 벗다

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

가상 스레드는 동시성과 IO 집약적 시나리오에서 상당한 성능 이점을 가지고 있지만 테스트 방법과 해당 시나리오에주의를 기울여야합니다. 1. 정확한 테스트는 실제 비즈니스, 특히 IO 차단 시나리오를 시뮬레이션하고 JMH 또는 Gatling과 같은 도구를 사용하여 플랫폼 스레드를 비교해야합니다. 2. 처리량 간격은 분명하며, 일정이 가볍고 효율적이기 때문에 10 만 동시 요청보다 여러 배에서 10 배나 높을 수 있습니다. 3. 테스트 중에, 높은 동시성 수치를 맹목적으로 추구하고, 비 차단 IO 모델에 적응하고, 대기 시간 및 GC와 같은 모니터링 지표에주의를 기울일 필요가있다. 4. 실제 애플리케이션에서는 웹 백엔드, 비동기 작업 처리 및 많은 동시 IO 시나리오에 적합하지만 CPU 집약적 작업은 플랫폼 스레드 또는 포크 플랫폼에 여전히 적합합니다.

Servicemesh는 Java Microservice Architecture의 진화를위한 불가피한 선택이며, 그 핵심은 네트워크 논리 및 비즈니스 코드를 분리하는 데 있습니다. 1. Servicemesh는 부하 밸런싱, 퓨즈, 모니터링 및 기타 기능을 부상 에이전트를 통해 처리하여 비즈니스에 중점을 둡니다. 2. Istio Envoy는 중간 및 대형 프로젝트에 적합하며 Linkerd는 가볍고 소규모 시험에 적합합니다. 3. Java 마이크로 서비스는 Feign, Ribbon 및 기타 구성 요소를 닫고 발견 및 의사 소통을 위해 Istiod로 넘겨야합니다. 4. 배치 중 사이드카의 자동 주입을 보장하고 트래픽 규칙 구성, 프로토콜 호환성 및 로그 추적 시스템 구성에주의를 기울이고 점진적인 마이그레이션 및 사전 제어 모니터링 계획을 채택하십시오.

JDBC 트랜잭션을 올바르게 처리하려면 먼저 자동 커밋 모드를 끄고 여러 작업을 수행 한 다음 결과에 따라 커밋 또는 롤백을 수행해야합니다. 1. 트랜잭션을 시작하려면 Conn.SetAutoCommit (False)에게 전화하십시오. 2. 인서트 및 업데이트와 같은 여러 SQL 작업을 실행합니다. 3. 모든 작업이 성공한 경우 Conn.commit ()에게 전화하여 데이터 일관성을 보장하기 위해 예외가 발생하면 Conn.Rollback ()에게 전화하십시오. 동시에, 재 시도는 리소스를 관리하고, 예외를 올바르게 처리하고, 연결 유출을 피하기 위해 긴밀한 연결을 사용하는 데 사용해야합니다. 또한 연결 풀을 사용하고 부분적으로 롤백을 달성하기 위해 저장 포인트를 설정하고 성능을 향상시키기 위해 거래를 가능한 한 짧게 유지하는 것이 좋습니다.

의존성 (DI) ISADESIGNPATTORNWHEREWHEDROUDIVESTESTESTETESTERGROWCONSTRUCTOR, 2.SPRINGFRAMEWWERTHUSENONTATIONS와 같은@autowiredWithjava 기반 CONCUTTATIONS LIKERWITHCONSTRUCTOR, ORFIELDINGESS.2.SPRINGFRAMEWWERTHUSENNOTATIONS

Pre-FormancetArtUptimeMoryUsage, Quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusoftenperforminglightbetterine serverless sinarios.2.thyvelopecosyste,

setupamaven/gradleProjectwithJax-rsddependencies likejersey; 2. createarestresourceUsingAnnotationsSuchas@pathand@get;

이전 날짜 및 달력 클래스를 대체하기 위해 Java.Time 패키지의 클래스를 사용하십시오. 2. LocalDate, LocalDateTime 및 LocalTime을 통해 현재 날짜와 시간을 얻으십시오. 3. () 메소드를 사용하여 특정 날짜와 시간을 만듭니다. 4. 플러스/마이너스 방법을 사용하여 시간을 불안정하게 늘리고 감소시킵니다. 5. ZonedDateTime 및 Zoneid를 사용하여 시간대를 처리하십시오. 6. DateTimeFormatter를 통해 형식 및 구문 분석 날짜 문자열; 7. 필요한 경우 이전 날짜 유형과 호환되도록 즉시 사용하십시오. 현대 Java의 날짜 처리는 명확하고 불변의 선형을 제공하는 Java.Timeapi 사용에 우선 순위를 부여해야합니다.

성능 분석 도구를 사용하여 병목 현상을 찾고 개발 및 테스트 단계에서 VisualVM 또는 JProfiler를 사용하며 생산 환경에서 Async-Profiler에 우선 순위를 부여합니다. 2. 객체 생성을 줄이고, 개체를 재사용하고, StringBuilder를 사용하여 문자열 스 플라이 싱을 교체하고, 적절한 GC 전략을 선택하십시오. 3. 장면에 따라 수집 사용을 최적화하고 초기 용량을 선택하고 사전 설정합니다. 4. 동시성 최적화, 동시 컬렉션을 사용하고, 잠금 세분화를 줄이고, 스레드 풀을 합리적으로 설정하십시오. 5. JVM 매개 변수 조정, 합리적인 힙 크기 및 저도 가비지 수집기를 설정하고 GC 로그를 활성화합니다. 6. 코드 레벨에서 반사를 피하고, 래퍼 클래스를 기본 유형으로 바꾸고, 초기화를 지연시키고, 최종 및 정적을 사용하십시오. 7. JMH와 결합 된 지속적인 성능 테스트 및 모니터링
