[모던 자바 인 액션] chap19. 함수형 프로그래밍 기법
·
Book/모던 자바 인 액션
내용일급 시민, 고차원 함수, 커링, 부분 적용영속 자료구조자바 스트림을 일반화하는 게으른 평가와 게으른 리스트패턴 매칭, 자바에서 패턴 매칭을 흉내 내는 방법참조 투명성과 캐싱 1. 함수는 모든 곳에 존재한다함수형 언어 프로그래밍이란 함수를 마치 일반값처럼 사용해서 인수로 전달하거나, 결과로 반환받거나, 자료 구조에 저장할 수 있음을 의미한다. 일반값처럼 취급할 수 있는 함수를 일급 함수라고 한다. 자바 8에서는 :: 연산자로 메서드 참조를 만들거나 (int x) -> x + 1 같은 람다 표현식으로 직접 함숫값을 표현해서 메서드를 함숫값으로 사용할 수 있다.Function shortToInt = Integer::parseInt;// 자바 8에서는 이렇게 메서드 참조로 Integer.parseInt를 ..
[모던 자바 인 액션] chap18. 함수형 관점으로 생각하기
·
Book/모던 자바 인 액션
내용왜 함수형 프로그래밍을 사용하는가?함수형 프로그래밍은 어떻게 정의하는가?선언형 프로그래밍과 참조 투명성함수형 스타일의 자바 구현 가이드 라인반복과 재귀 1. 시스템 구현과 유지보수함수형 프로그래밍이 제공하는 부작용 없음과 불변성이라는 개념이 유지보수의 문제를 해결하는데 도움을 준다. 1. 공유된 가변 데이터변수가 예상하지 못한 값을 갖는 이유는 결국 우리가 유지보수하는 시스템의 여러 메서드에서 공유된 가변 데이터 구조를 읽고 갱신하기 때문이다. 어떤 자료구조도 바꾸지 않는 시스템이 있다고 가정하자. 예상하지 못하게 자료구조의 값이 바뀔 일이 없으니 얼마나 유지보수하기 쉽겠는가! 자신을 포함하는 클래스의 상태 그리고 다른 객체의 상태를 바꾸지 않으며 return 문을 통해서만 자신의 결과를 반환하는 메..
[모던 자바 인 액션] chap13. 디폴트 메서드
·
Book/모던 자바 인 액션
내용디폴트 메서드란 무엇인가?진화하는 API가 호환성을 유지하는 방법디폴트 메서드의 활용 패턴해결 규칙전통적인 자바에서 인터페이스와 관련 메서드는 한 몸처럼 구성된다. 인터페이스를 구현하는 클래스는 인터페이스에서 정의하는 모든 메서드 구현을 제공하거나 아니면 슈퍼 클래스의 구현을 상속받아야 한다. 기존의 List 인터페이스를 구현했던 모든 프로그래머가 sort 메서드를 구현하도록 List 인터페이스를 상속ㄴ한 모든 클래스를 고쳐야 한다고 발표한다면 당황스러울 것이다.하지만 걱정 할 필요 없다! 자바 8 에서는 이 문제를 해결하는 새로운 기능을 제공한다. 1. 변화하는 API이미 릴리즈된 인터페이스를 고치면 어떤 문제가 발생하는지 살펴보자. 1. API 버전 1public interface Resizabl..
[모던 자바 인 액션] chap12. 새로운 날짜와 시간 API
·
Book/모던 자바 인 액션
내용자바 8에서 새로운 날짜와 시간 라이브러리를 제공하는 이유사람이나 기계까 이해할 수 있는 날짜와 시간 표현 방법시간의 양 정의하기날짜 조작, 포매팅, 파싱시간대와 캘린더 다루기자바 8에서는 지금까지의 날짜와 시간 문제를 개선하는 새로운 날짜와 시간 API를 제공한다. 자바 1.0에서는 java.util.Date 클래스 하나로 날짜와 시간 관련 기능을 제공했다. 날짜를 의미하는 Date라는 클래스의 이름과 달리 Date 클래스는 특정 시점을 날짜가 아닌 밀리초 단위로 표현한다. 게다가 1900년을 기준으로 하는 오프셋, 0에서 시작하는 달 인덱스 등 모호한 설계로 유용성이 떨어졌다.Date date = new Date(117, 8, 21);// 출력 결과 : Thu SEp 21 00:00:00 CET ..
[모던 자바 인 액션] chap09. 리팩터링, 테스팅, 디버깅
·
Book/모던 자바 인 액션
내용람다 표현식으로 코드 리팩터링하기람다 표현식이 객체지향 설계 패턴에 미치는 영향람다 표현식 테스팅람다 표현식과 스트림 API 사용 코드 디버깅1. 가독성과 유연성을 개선하는 리팩터링9.1절에서는 지금까지 배운 람다, 메서드 참조, 스트림 등의 기능을 이용해서 더 가독성이 좋고 유연한 코드로 리팩터링하는 방법을 설명한다. 1. 코드 가독성 개선9장에서는 람다, 메서드 참조, 스트림을 활용해서 코드 가독성을 개선할 수 있는 간단한 세 가지 리팩터링 예제를 소개한다.익명 클래스를 람다 표현식으로 리팩터링하기람다 표현식을 메서드 참조로 리팩터링하기명령형 데이터 처리를 스트림으로 리팩터링하기 2. 익명 클래스를 람다 표현식으로 리팩터링하기모든 익명 클래스를 람다 표현식으로 변환할 수 있는 것은 아니다. 첫째,..
[모던 자바 인 액션] chap06. 스트림으로 데이터 수집
·
Book/모던 자바 인 액션
내용Collectors 클래스로 컬렉션을 만들고 사용하기하나의 값으로 데이터 스트림 리듀스하기특별한 리듀싱 요약 연산데이터 그룹화와 분할자신만의 커스텀 컬렉터 개발Map> transactionsByCurrencies = new HashMap();for (Transaction transaction : transactions) { Currency currency = transaction.getCurrency(); List transactionsForCurrency = transactionsByCurrencies.get(currency); if (transactionsForCurrency == null) { transactionsForCurrency = new ArrayList(); transact..
[모던 자바 인 액션] chap05. 스트림 활용
·
Book/모던 자바 인 액션
내용필터링, 슬라이싱, 매칭검색, 매칭, 리듀싱특정 범위의 숫자와 같은 숫자 스트림 사용하기다중 소스로부터 스트림 만들기무한 스트림// 외부 반복List vegetrianDishes = new ArrayList(); for(Dish d : menu) { if(d.isVegetarian()) vegetrianDishes.add(d); }// 내부 반복List vegetrianDishes = menu.stream() .filter(Dish::isVegetarian) .collect(Collectors.toList()); 1. 필터링1. 프레디케이트로 필터링filter 메서드는 프레디케이트를 인수로 받아서 프레디케이트와 일치하는 모든 요소를 포함하는 스트림을 반환한다.List vegetrianDish..
[모던 자바 인 액션] chap04. 스트림이란?
·
Book/모던 자바 인 액션
내용스트림이란 무엇인가?컬렉션과 스트림내부 반복과 외부 반복중간 연산과 최종 연산 List lowCaloricDishes = new ArrayList(); for(Dish dish : menu) { if(dish.getCalories() () { public int compare(Dish dish1, Dish dish2) { return Integer.compare(dish1.getCalories(), dish2.getCalories()); } }); List lowCaloricDishesName = new ArrayList(); for(Dish dish : lowCal..
[모던 자바 인 액션] chap03. 람다 표현식(2)
·
Book/모던 자바 인 액션
람다는 함수형 인터페이스의 인스턴스를 만들 수 있다. 람다 표현식 자체에는 람다가 어떤 함수형 인터페이스를 구현하는지의 정보가 포함되어 있지 않다. 따라서 람다 표현식을 더 제대로 이해하려면 람다의 실제 형식을 파악해야 한다.람다 표현식의 형식 추론List heavierThan150g = filter(inventory, (Apple apple) -> apple.getWeight() > 150);// 이 경우, filter 메서드는 Predicate을 기대한다.Object o = (Runnalbe) () -> { System.out.println("Tricky example"); };// 이렇게 캐스팅 할 수도 있다.List greenApples = filter(inventory, apple -> GREE..
[모던 자바 인 액션] chap03. 람다 표현식(1)
·
Book/모던 자바 인 액션
람다 표현식 - 메서드로 전달할 수 있는 익명 함수를 단순화한 것람다의 특징익명함수 - 람다는 메서드처럼 특정 클래스에 종속되지 않으므로 함수라고 부른다. 하지만 메서드처럼 파라미터 리스트, 바디, 반환 형식, 가능한 예외 리스트를 포함한다.전달 - 람다 표현식은 메서드 인수로 전달하거나 변수로 저장할 수 있다.간결성// 기존에 사용하던 코드Comparator byWeight = new Comparator() { @Override public int compare(Apple o1, Apple o2) { return o1.getWeight().compareTo(a2.getWeight()); }}// 람다를 사용하면 간편해진다.Comparator byWeight = (o1, o2) -> o1.getWeig..