I'm pine thank you and you?

[JAVA, JS] map, filter, reduce, forEach 본문

CS

[JAVA, JS] map, filter, reduce, forEach

SollyJ 2023. 1. 20. 15:06

map

매개변수가 1개이고 return을 하는 함수 매개변수로 받아서 배열의 모든 요소를 매개변수로 대입해서 그 결과를 가지고 배열로 return

배열에 어떤 연산을 가해서 새로운 배열을 만들고자 할 때 사용한다.

  • 자바스크립트에서 써보기
var ar = [10, 20, 30, 40, 50, 60];

// map
// ar의 모든 원소에 10을 곱해서 배열로 리턴한다.
var result_ar = ar.map((e) => {
	return e * 10
})
console.log(result_ar);
  • 자바에서 써보기

자바에서는 Stream 인터페이스에서 map() 함수를 지원한다.

따라서 리스트를 stream화 시킨 다음에 해당 함수를 쓸 수 있다.

ArrayList<String> list = new ArrayList<>(Arrays.asList("a", "b", "c", "d"));

// map
// 리스트의 모든 원소를 대문자로 바꿔서 리턴
Stream<String> result_list = list.stream().map((e) -> e.toUpperCase());

result_list.forEach(System.out::println);
  • forEach

배열이나 리스트 탐색 기법

반복문 내에 카운터 변수, 콜론(:), 배열이름을 순서대로 선언한다.

카운터 변수가 배열의 원소를 차례로 순회하는 반복문이다.

하지만, 배열을 역순으로 탐색할 수 없다는 단점이 있다.

 

filter

매개변수가 1개이고 Boolean을 return 하는 함수매개변수로 받아서 배열의 모든 요소를 매개변수로 대입해서 함수를 호출한 후 true를 return한 데이터만 모아서 배열로 리턴

조건에 맞는 것만 필터링 하기 위해 쓴다.

  • 자바스크립트에서 써보기
// filter
// 특정 문자 포함 문자열만 필터링하기
var search_ar = ["korea", "area", "earth", "japan", "africa"];
var result_ar = search_ar.filter((e) => {
	return e.indexOf("ea") >= 0
})
console.log(result_ar);
  • 자바에서 써보기

자바에서는 Stream 인터페이스에서 filter() 함수를 지원한다.

따라서 리스트를 stream화 시킨 다음에 해당 함수를 쓸 수 있다.

ArrayList<String> list = new ArrayList<>(Arrays.asList("cabinet", "banana", "character", "chip", "apple"));
		
// filter
// c로 시작하는 단어만 필터링하기
Stream<String> result_list = list.stream().filter((e) -> e.substring(0, 1).equals("c"));

result_list.forEach(System.out::println);

 

reduce

배열을 순회하면서 연산(함수)을 수행한 후 하나의 값을 리턴

배열의 요소들을 하나의 데이터로 만드는 작업

  • 자바스크립트에서 써보기
var ar = [10, 20, 30, 40, 50, 60];

// reduce
// 10+20=30, 30+30=60, 60+40=100, 100+50=150, 150+60=210
ar.reduce((a, b) => a + b)
  • 자바에서 써보기

자바에서는 Stream 인터페이스에서 reduce()함수를 지원한다.

따라서 리스트를 stream화 시킨 다음에 해당 함수를 쓸수 있다.

자바 reduce는 3개의 매개변수를 받는다.

  1. T identity: 계산에 적용할 초깃값으로, 스트림이 비어 있더라도 초깃값을 반환
  2. BinaryOperator<T> accumulator: 적용할 연산 함수
    • `(accumulate, n) -> accumulate + n` 형태로 쓰이며 accumulate에는 누적값이 들어간다.
  3. BinaryOperator<U> combiner: 병렬 스트림에서 각 스레드 계산 결과를 합치는 함수

자바 reduce는 Optional 객체를 반환한다.

ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));

// reduce
// 리스트의 값을 모두 더한 값을 반환
Optional<Integer> result_list = list.stream().reduce((a, b) -> a + b);

System.out.println(result_list);