블로그

Java - Stream과 Lambda

Stream 정리Java Stream은 데이터를 추상화하여 데이터 타입과 무관하게 간결하고 일괄적으로 데이터(컬렉션, 배열)를 처리할 수 있게 하는 Api이다.  Java Stream 특징일회성이다. 반환값을 정의하지 않는 한 재사용이 불가하며, 처리한 결과물은 사라진다.기존 자료를 변경하지 않는다.최종 연산이 호출되어야 중간연산이 진행된다. 중간 연산filter조건문 사용 -> 조건문에 해당하는 데이터만 가져옴list.stream().filter(i -> i.getNumber() > 10)filter() + findAny() 조합도 유용map각 요소에서 특정 속성만을 추출하여 가져옴list.stream().map(i -> i.getId())sorted.sorted() | .sorted(Comparator.comparing(기준 람다식))역순.sorted(Comparator.reverseOrder()) .sorted(Comparator.comparing(기준 람다식).reversed()) 최종 연산forEachfilter나 map과 같은 중간연산이 없다면 Stream.forEach()보다 Collection.forEach()로 작업하는 것이 thread-safe하다.countsumlist.stream().mapToInt(i -> i.getPrice()).sum() reduce(초기값, (a, b) -> {실행문})reduce(0, (a, b) -> a + b)위의 예시는 최종적으로 요소들의 합이 반환하는 코드이다."", (s1, s2) -> if(s1.length >= s2.length) return s1; else return s2;위의 예시는 가장 긴 문자열 반환하는 코드이다. collectliststream().map().collect(Collectors.toList())mapstream().filter().collect(Collectors.toMap(i -> i.getKey(), i -> i.getValue()))stream().collect(Collectors.toMap(Object::getId, Function.identity()))Function.identity() 가 Object 반환toMap 사용 시 중복 key있을 경우 k, v 설정 뒤에 (e1, e2) -> e1) 추가하여 처리groupingstream().collect(Collectors.groupingBy(i -> i.getId()))반환값은 Map<Long, List<Object>> 아이디를 기준으로 그룹화됨  Lambda 정리람다란 단일 추상 메서드를 가지는 함수형 인터페이스를 활용하는 문법이다. 람다와 메서드 참조를 통해 함수형 프로그래밍을 더욱 효과적으로 구현할 수 있다.람다의 특징매개변수만으로 자료를 처리한다.독립적이기에 병렬처리에 적합하다.람다식을 변수로 활용 가능하다.람다의 구조(매개변수) -> { 실행문; }매개변수가 하나일 때, 실행문이 한 줄일 때 괄호 생략이 가능하다.매개변수 -> 실행문람다 예시(a, b) -> { return a + b }(a, b) -> a == b ? a : b age -> age > 19 ? '성인' : '미성년자'메서드 참조 예시 Object::method생성자의 경우 Object::new기본 생성자라면 () -> new Object(); 와 같음매개변수가 있다면 i -> new Object(i);와 같음  

JavaStreamLambda

채널톡 아이콘