backend

[책] 함수형 사고 - Chapter 1. 왜

버리야 2018. 7. 15. 22:35
반응형

책 함수형 사고(Functional Thinking)을 읽고, 관련 예제를 살펴보며 간단 정리한 것입니다.

책 예제와는 조금 다를 수도 있습니다.


참고) 영문 책의 예제

https://github.com/oreillymedia/functional_thinking


Chapter 1. 왜


전혀 새로운 프로그래밍 패러다임의 문제는 새로운 언어를 배우는 것이 아니고, 다른 방식으로 사고하는 법을 배우는 것.


객체지향 프로그래밍은 움직이는 부분을 캡슐화하여 코드 이해를 돕고, 함수형 프로그래밍은 움직이는 부분을 최소화하여 코드 이해를 돕는다.

- 마이클 페더스


함수형 개발자는 적은 수의 자료구조와 그것들을 잘 이해하기 위한 최족화된 방법을 만들기를 선호한다.

객체지향형 개발자는 항상 새로운 자료구조와 그것에 부착된 메서드를 만든다. 클래스와 통신 메시지를 만드는 것이 지배적인 객체지향 패러다임이다.

모든 자료구조를 캡슐화하면 메스드 수준의 재사용보다는 큰 프레임워크 스타일의 재사용을 선호하게 된다.

함수형 프로그래밍 구조는 세부적인 단계에서 쉽게 코드를 재사용할수 있게 한다.

 

/**
 * Chapter 1. 왜
 * 예제 : 텍스트 파일을 읽고, 가장 많이 사용된 단어들을 찾고, 그 단어들과 빈도를 정렬된 목록으로 출력하라.
 */

public class Words {

	private Set NON_WORDS = new HashSet() {
		{
			add(",");
		}
	};

// 자바 8  이전의 단어 빈도 수 세기
	public Map freq(String words) {
		TreeMap wordMap = new TreeMap<>();

		Matcher m = Pattern.compile("\\w+").matcher(words);

		while (m.find()) {
			String word = m.group().toLowerCase();
			if (!NON_WORDS.contains(word)) {
				if (wordMap.get(word) == null) {
					wordMap.put(word, 1);
				} else {
					wordMap.put(word, wordMap.get(word) + 1);
				}
			}
		}

		return wordMap;
	}

// 자바 8  이후의 단어 빈도 수 세기
	public Map freqLambda(String words) {
		TreeMap wordMap = new TreeMap<>();

		regexForList(words, "\\w+").stream()
				.map(w -> w.toLowerCase())
				.filter(w -> !NON_WORDS.contains(w))
				.forEach(w -> wordMap.put(w, wordMap.getOrDefault(w, 0) + 1));
		return wordMap;
	}

	private List regexForList(String words, String regex) {
		List wordList = new ArrayList();
		Matcher m = Pattern.compile(regex).matcher(words);
		while (m.find()) {
			wordList.add(m.group());
		}

		return wordList;
	}
}



반응형