JAVA/Java 기초

루핑, 매칭, 집계.java

john_ 2023. 1. 30. 11:10
728x90

루핑(요소를 하나씩 처리: looping)

스트림에서 요소를 하나씩 반복해서 가져와 처리하는 것입니다.

 

 

  • 매개타입인 Consumer는 함수형 인터페이스입니다. 모든 Consumer는 매개값을 처리(소비)하는 accept() 메소드를 가지고 있습니다.

Consumer<? Super T>를 람다식으로 표현하면 다음과 같습니다.

 

LoopingExam.java

import java.util.Arrays;

public class LoopingExam {

	public static void main(String[] args) {

		int[] intArr = {1,2,3,4,5};
		
		//잘못 작성한 경우  peek(중간처리 : 최종처리 부분이 필요합니다)
		Arrays.stream(intArr)
			.filter(a -> a%2 == 0)	// 2의 배수 찾기
			.peek(n -> System.out.println(n));
			// 최종처리가 없으므로 동작 하지 않습니다.
		
		// peek(중간처리) 뒤에 sum() 최종처리 - 정상처리
		int total = Arrays.stream(intArr)
			.filter(a -> a%2 == 0) // 2의 배수찾기
			.peek(n -> System.out.println(n))
			.sum(); // 최종 처리
		System.out.println("총합 : " + total + "\n");
		
		// forEach()를 이용해서 반복처리
		Arrays.stream(intArr)
			.filter(a -> a%2 == 0)
			.forEach(n -> System.out.println(n));
			//최종 처리이므로 동작합니다.
	}
}
결과:
2
4
총합 : 6

2
4

 


매칭(요소 조건 만족 여부)

  • 요소들이 특정 조건에 만족하는지 여부를 조사하는 최종 처리 기능입니다.
  • allMatch(), anyMatch(), noneMatch() 메소드는 매개값으로 주어진 Predicate가 리턴하는 값에 따라 true or false를 리턴합니다.

 

 


 

import java.util.Arrays;

public class MatchingExam {

	public static void main(String[] args) {

		int[] intArr = {2, 4, 6};
		
		boolean result = Arrays.stream(intArr)
				.allMatch(a -> a%2 ==0);	// 2의 배수인가?
		System.out.println("모두 2의 배수인가? " + result);

		result = Arrays.stream(intArr)
				.anyMatch(a -> a%3 ==0);	// 하나라도 3의 배수가 있는가?
		System.out.println("하나라도 3의 배수가 있는가? " + result);
		
		result = Arrays.stream(intArr)
				.noneMatch(a -> a%3 ==0);	//3의 배수가 없는가?
		System.out.println("3의 배수가 없는가? " + result);
	}
}
결과 :
모두 2의 배수인가? true
하나라도 3의 배수가 있는가? true
3의 배수가 없는가? false

 


집계(요소 기본 집계)

최종 처리기능으로 요소들을 처리해서 카운팅, 합계, 평균값, 최대값, 최소값 등 하나의 값으로 산출하는것입니다.

 


 

스트림이 제공하는 기본 집계

스트림은 카운팅, 최대, 최소, 평균, 합계 등을 처리하는 다음과 같은 최종 처리 메소드를 제공합니다.

 

  • 집계 메소드가 리턴하는 OptionalXXX는 Optional, OptionalDouble, OptionalInt, OptionalLong 클래스를 지칭합니다.
  • 이들은 최종값을 저장하는 객체로 get(), getAsDouble(), getAsInt(), getAsLong()을 호출하여 최종값을 얻을수 있습니다.

import java.util.Arrays;

public class AggregateExam {

	public static void main(String[] args) {

		int[] arr = {1,2,3,4,5};
		
		// 카운팅
		long count = Arrays.stream(arr)
				.filter(n->n%2 ==0)	//2의 배수
				.count();			//2의 배수의 갯수
		System.out.println("2의 배수 개수 " + count);
		
		// 총합
		long sum = Arrays.stream(arr)
				.filter(n->n%2 ==0)	//2의 배수
				.sum();				//총합
		System.out.println("2의 배수의 합 : " + sum);
		
		double avg = Arrays.stream(arr)
				.filter(n->n%2 ==0)	//2의 배수
				.average()			//평균
				.getAsDouble();		//int 타입을 double 타입으로 변환
		System.out.println("2의 배수의 평균 : " + avg);
		
		int max = Arrays.stream(arr)
				.filter(n->n%2 ==0) //2의 배수
				.max()				//최대값
				.getAsInt();		//long 타입을 int 타입으로 변환
		System.out.println("최대값: " + max);
		
		int min = Arrays.stream(arr)
				.filter(n->n%2 ==0) //2의 배수
				.min()				//최소값
				.getAsInt();		//long 타입을 int 타입으로 변환
		System.out.println("최소값: " + min);
		
		int first = Arrays.stream(arr)
				.filter(n -> n%3 == 0)	//3의 배수
				.findFirst()			//처음으로 나오는 값 찾기
				.getAsInt();			//long 타입을 int 타입으로 변환
		System.out.println("3의 배수의 처음값 : " + first);
	}
}
결과 : 
2의 배수 개수 2
2의 배수의 합 : 6
2의 배수의 평균 : 3.0
최대값: 4
최소값: 2
3의 배수의 처음값 : 3

///
OptionalDouble avg = Arrays.stream(arr)
		.filter(n->n%2 ==0)	//2의 배수
		.average();		//평균
System.out.println("2의 배수의 평균 : " + avg);

결과 : 
2의 배수의 평균 : OptionalDouble[3.0]

 

728x90

'JAVA > Java 기초' 카테고리의 다른 글

입출력 스트림.java  (0) 2023.01.30
Optional 클래스.java  (0) 2023.01.30
정렬. java  (0) 2023.01.30
람다식.java  (0) 2023.01.27
컬렉션 자료구조3.java  (0) 2023.01.26