목록JAVA (5)
참새의 이야기
필터링 stream의 filter 메서드는 인수로 받은 predicate와 일치하는 모든 요소를 포함하는 스트림을 반환한다. List vegetarianDished =menu.stream() .filter(Dish::isVegetarian) .collect(toList()); 이 경우에는 Dish의 isVegetarian()이 true라면 모두 포함한 stream을 만들고 .collect(toList())가 리스트로 바꿔 반환한다. distinct 아래와 같은 정수 리스트가 있다고 하자. List numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4); 이 정수 리스트에서 짝수만을 출력하되, 같은 값에 대해서는 한 번만 출력하고 싶다면 distinct를 사용하면 된다. 같은 지에..
SQL에서 where로 처리하던 로직을 컬렉션으로도 만들 수 있지 않을까? 크기가 큰 컬렉션은 병렬적으로 처리해야 할 텐데 이 코드를 단순하게 할 수 없을까? 이 두 질문의 답으로 스트림을 제안한다. 지난 프로젝트를 하면서 스트림을 안 썼다면 코드가 훨씬 길고 복잡해지겠다는 생각을 했다. 스트림을 야무지게 쓰기 위해 스트림이 무엇인지부터 알아보자. 스트림이란 스트림은 자바 8에 새로 추가된 기능으로, 선언형으로 컬렉션 데이터를 처리할 수 있다. 선언형이라는 것은 데이터를 임시 구현 코드 대신 질의로 처리할 수 있다는 의미다. 멀티 스레드 코드를 구현하지 않아도 병렬 처리를 할 수 있다는 점도 장점이다. 다음의 자바 코드를 스트림으로 개선해보자. List lowCaloricDishes = new Array..
앞선 챕터에서 등장한 람다 표현식을 조금 더 자세히 알아보고 메서드 참조에 대해서도 알아보자. 람다는 무엇인가 람다는 이름이 없는 익명이다. 람다는 특정 클래스에 종속되지 않으므로 함수다. 메서드의 파라미터로 전달하거나 변수로 저장할 수 있다. 람다 표현식 (Apple a1, Apple a2) → a1.getWeight().compareTo(a2.getWeight()); 람다는 세 부분으로 이루어진다. (Apple a1, Apple a2) 파라미터 리스트 → 화살표 a1.getWeight().compareTo(a2.getWeight()); 람다 바디 어디에서 쓸 수 있는가 람다 표현식은 함수형 인터페이스라는 문맥에서 사용할 수 있다. 함수형 인터페이스란 추상 메서드가 오직 하나인 인터페이스를 말한다. 예..
변화하는 요구사항에 대응하기 위해 동작 파라미터화를 사용할 수 있다. 하지만, 동작 파라미터화는 코드가 길어지게 한다. 자바 8에서는 람다 표현식으로 이 문제를 해결한다. 요구사항에 대응 녹색 사과 필터링 public static List filterGreenApples(List inventory) { List apples = new ArrayList(); for (Apple apple:inventory) { if(Green.equals(apple.getColor())) { apples.add(apple) } } return apples; } 녹색 사과를 필터링하는 경우만 생각하면 위의 코드도 좋은 코드가 될 수 있다. 갑작스럽게 빨간 사과를 필터링하고 싶다는 요구 사항이 추가되면 어떻게 대응할 수 있을..
자바 8은 병렬 연산을 위해 스트림 API를 지원한다. 이 스트림 API 덕분에 메서드에 코드를 전달하는 기법(메서드 참조와 람다)과 인터페이스의 디폴트 메서드가 존재할 수 있다. 스트림 처리 스트림을 정의하자면 ‘한 번에 하나씩 만들어지는 연속적인 데이터 항목들의 모임’이다. 자바 8의 java.util.stream 패키지에는 Stream Interface가 존재한다. Stream는 T 형식으로 구성된 일련의 항목을 의미한다. 이 스트림에 대하여 스트림 API는 많은 메서드를 제공하고, 이를 조합하여 스트림 파이프라인을 구성하여 사용하게 된다. 덕분에 스레드를 활용하지 않아도 스트림이 알아서 병렬적인 처리를 해준다. 동작 파라미터화: 메서드에 코드 전달하기 코드를 API로 전달하는 기능이다. sort ..