DBILITY

java lambda map,reduce,filter summary 본문

java/basic

java lambda map,reduce,filter summary

DBILITY 2018. 5. 25. 21:22
반응형

java8에 추가된 stream을 이용해 보자.

MapReduce에선 mapper에서 한줄씩 읽어 조건에 맞는 데이터 처리등 transform을 하고 한줄씩 쓰고,

reducer에서 key를 기준으로 reduction,aggregation 즉 집계처리할 수 있는데, 2년전에 해본거라 기억이 가물거리지만ㅎㅎ

stream을 이용하면 map,reduce가 가능하다. 마치 method chain(?)처럼 동작한다. 

stream은 일종의 데이터의 순열정도라고 본다.nPr? 아니다. 그냥 순서가 있는 원소의 집합이라고 해야 할까...

아래 코드는 1~10까지의 정수형 배열의 요소의 합계를 계산하는 것이다.

기록하고 몇번이건 봐야 기억할 수 있다.피곤하다.

package com.dbility.bigdata.lambda.test;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class Test03 {

	public static void main(String[] args) {

		Integer[] array = new Integer[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
		int sum = 0;
		for (int i = 0; i < array.length; i++) {
			sum += array[i];
		}
		// for loop sum
		System.out.println(String.format("for loop sum : %d",sum));

		sum = 0;
		List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
		Iterator<Integer> iterator = list.iterator();
		while (iterator.hasNext()) {
			sum+=iterator.next();
		}
		// iterator sum
		System.out.println(String.format("iterator sum : %d",sum));

		// stream은 collection 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 internal iterator
		sum = list.stream().mapToInt(x -> x).sum();
		System.out.println(String.format("intStream sum : %d",sum));

		 // 하나로 합침.MapReduce Reducer ?
		sum = list.stream().reduce((x, y) -> x + y).get();
		System.out.println(String.format("stream reduce sum : %d",sum));

		//for loop를 돌면서  Each 각각, 아래 4개는 동일한 출력
		list.stream().forEach(System.out::println);// 정적메서드 참조시 클래스명::메서드
		list.stream().forEach((Integer x)->{ System.out.println(String.format("%d", x));});
		list.stream().forEach((x)->{ System.out.println(String.format("%d", x));});
		list.stream().forEach(x->{ System.out.println(String.format("%d", x));});

		// 1. 입력을 출력으로 매핑하거나 변경할때(요소수 변경없음,MapReduce의 Mapper?)
		list.stream().map(x -> x * 2).forEach((x)->System.out.println(x));

		// 2. 조건에 의해 요소 필터링
		list.stream().filter(x -> x >= 5).forEach(System.out::println);

		// 3. 하나로 합침.MapReduce Reducer ?
		System.out.println(list.stream().reduce((x, y) -> x + y).get());

		// 1.2.3을 chainning
		Integer j = list.stream().map(x -> x * 2)
				.filter(x -> x >= 5)
				.reduce((x, y) -> x + y)
				.get();

		System.out.println(j);

	}
}

 

반응형

'java > basic' 카테고리의 다른 글

generic type의 사용 이유  (0) 2018.05.28
java lambda stream 실습  (0) 2018.05.27
java lambda  (0) 2018.05.25
maven uber-jar packaging  (0) 2018.04.30
maven build war package exclude paths or files ( 특정 경로 제외 )  (0) 2018.04.11
Comments