Book/모던 자바 인 액션6 [정리] 모던 자바 인 액션 - 스트림 활용(2) 만약 스트림을 활용해 아래와 같은 질의를 수행하려면 어떻게 해야할까? '메뉴에서 칼로리가 가장 높은 요리는?' '메뉴의 모든 칼로리의 합계는?' 리듀싱 리듀싱 연산은 모든 스트림 요소를 처리해서 하나의 값으로 도출하는 연산을 말한다. 위와 같은 질의는 리듀싱 연산을 사용하여 해결할 수 있다. 리듀싱 내 두 번째 인자로 계산된 결과값은 다음 스트림 요소의 입력 인자가 된다. 리듀싱 연산은 스트림이 하나의 값으로 줄어들 때까지 연산을 반복해서 조합한다. // 기본적인 반복문 int sum = 0; // sum 변수의 초기값 for (int x : numbers) { sum += x; // sum 값을 도출하기 위해 반복되는 연산 (+) } // 리듀스를 사용 // 첫 번째 인자 : sum 초기값 0 // 두.. 2023. 1. 8. [정리] 모던 자바 인 액션 - 스트림 활용(1) 필터링 filter(Predicate) : boolean을 반환하는 Predicate를 인수로 받아 일치하는 요소만 포함하는 스트림 반환 distinct() : 고유 요소로만 이루어진(=중복 제거된) 스트림 반환 // Predicate로 필터링 : boolean을 반환하는 Predicate을 인수로 받아 일치하는 요소만 필터링 List vegetarianMenu = menu.stream() .filter(Dish::isVegetarian) .collect(toList()); // 고유 요소 필터링 : distinct로 고유 요소 필터링 List numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4); numbers.stream() .filter(i -> i % 2 == 0) .d.. 2023. 1. 7. [정리] 모던 자바 인 액션 - 스트림 소개 스트림은 자바 8 API에 새로 추가된 기능으로, 스트림을 사용하면 선언형(구현코드 대신 질의의 형태)로 컬렉션 데이터를 처리할 수 있다. 선언형의 예로 데이터베이스 질의를 들 수 있는데, SELECT name FROM disches WHERE calorie < 400 ORDER BY calorie는 칼로리가 400 미만인 요리명을 출력하라는 SQL질의이며 결과를 얻기 위해 질의할 뿐 구체적인 구현 코드를 전달하진 않는다. 만약 자바 7 코드로 위 예제를 구현하려 했다면 아래와 같았을 것이다. // 400 칼로리보다 아래인 dish들만 수집 List lowCaloricDishes = new ArrayList(); for(Dish dish: menu) { if(dish.getCalories < 400){ .. 2023. 1. 6. [정리] 모던 자바 인 액션 - 람다 표현식 (Lambda Expression)(2) 람다 표현식이 함수형 인터페이스의 인스턴스로 동작할 수 있다고 하였는데, 실제 람다 표현식에는 이 람다가 어떤 함수형 인터페이스를 구현하고 있는지에 대한 정보가 나와있지 않다. 람다의 형식 검사, 형식 추론, 제약 람다가 어떤 함수형 인터페이스를 구현하고 있는지 직접적으로 나와 있진 않지만, 람다의 문법을 보고 람다의 형식을 추론할 수는 있다. 람다가 전달될 메서드의 파라미터, 람다가 할당되는 변수 등에서 람다 표현식의 형식을 추론해볼 수 있는데 이를 대상형식이라 한다. List heavierThan150g = filter(inventory, (Apple apple) -> apple.getWeight() > 150); 1. filter 메서드를 확인한다. 2. filter 메서드는 두 번째 파라미터로 P.. 2023. 1. 5. [정리] 모던 자바 인 액션 - 람다 표현식 (Lambda Expression)(1) 익명 클래스로 동작을 구현할 수 있었지만, 기대한만큼 깔끔한 코드가 나오진 못했다. 조금 더 깔끔하고 단순한 코드로 동작을 구현할 수 있는 자바 8의 새로운 기능 람다 표현식을 설명한다. 람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이라 말할 수 있다. 람다를 사용함으로써 얻는 가장 큰 이득 중 하나는 익명 클래스 등에 형식상 들어가야만 했던 코드들을 더 이상 사용하지 않아도 된다는 점이다. // lambda 적용 전 Comparator byWeight = new Comparator() { public int compare(Apple a1, Apple a2) { return a1.getWeight().compareTo(a2.getWeight()) ; } }; // lambda 적용 후 .. 2023. 1. 4. [정리] 모던 자바 인 액션 - 동작 파라미터화 (Behavior Parameterization) 동작 파라미터화(Behavior Parameterization 또는 행위 매개변수)란 아직 어떻게 실행할 것인지 결정하지 않은 코드블록을 의미한다. 이 코드블록은 나중에 프로그램에서 호출하며 즉, 코드 블록 실행은 나중으로 미뤄진다. 코드 블록에 메서드의 동작이 파라미터화 된다. 동작을 파라미터화 하므로서 변화하는 요구사항에 보다 효율적으로 대응 가능해진다. 다음은 예제와 그 과정이다. 첫 번째 시도 : 녹색 사과 필터링 녹색 사과를 필터링 해달라는 요청이 있어 아래와 같이 구현하였다. 기능은 동작하지만 아래 로직으로는 오로지 녹색 사과만 필터링할 수 있다. public static List filterGreenApples(List inventory) { List result = new ArrayList.. 2023. 1. 3. 이전 1 다음