forEach 메서드Map.Entry 의 반복자를 이용하던 것을 BiConsumer를 인수로 받는 forEach 메서드 지원Map ageOfFriends = Map.of("A", 27, "B", 21, "C", 25);for(Map.Entry entry : ageOfFriends.entrySet()) { String friend = entry.getKey(); Integer age = entry.getValue(); System.out.println(friend + " is " + age + " years old.");}ageOfFriends.forEach((friend, age) -> System.out.println(friend + " is " + age + " years old.")..
컬렉션 팩토리 자바 9에서는 컬렉션 객체를 쉽게 만들 수 있는 방법을 제공 고정 크기의 리스트를 만들었으므로 요소를 갱신할 수 있지만 추가하거나 삭제 불가 (UnsupportedOperationException 발생) List friends = Arrays.asList("A", "B", "C"); List 정적 팩토리 메소드 List.of 팩토리 메소드로 변경할 수 없는 리스트 생성 요소를 추가하려면 UnsupportedOperationException 발생 set() 메서드로 변경하려해도 예외 발생 null 요소는 금지하므로 의도치 않은 버그를 방지 List.of 팩토리 메소드는 다양한 오버로드 버전 (최대 10개까지) 10개 이상의 요소는 가변인수 버전의 팩토리 메소드 사용 추가 배열을 할당해서 리스..
gradle// https://mvnrepository.com/artifact/org.json/jsonimplementation 'org.json:json:20230618'Object to JsonUser user = new User("Chris", 34);Car car1 = new Car();car1.setName("K5");car1.setCarNumber("1234");car1.setType("SUV");Car car2 = new Car();car2.setName("K7");car2.setCarNumber("1111");car2.setType("SEDAN");List carsList = Arrays.asList(car1, car2);user.setCars(carsList..
Mokito FrameworkMockito는 Java에서 Mock 객체를 만들고 테스트하는 데 사용되는 인기있는 프레임워크다른 클래스에 대한 가짜(Mock) 객체를 만들고, 해당 객체가 어떻게 동작해야 하는지를 정의하고, 테스트 중에 해당 객체의 동작을 검증Mockito는 테스트 주도 개발(Test Driven Development, TDD) 및 단위 테스트 작성을 보다 쉽고 효율적으로 만들어줍니다.JUnit과 같은 테스트 프레임워크와 함께 사용 Mock 객체 생성: Mockito를 사용하여 다른 클래스의 가짜(Mock) 객체를 생성할 수 있습니다.동작 정의: Mockito를 사용하여 Mock 객체의 특정 메서드 호출에 대한 동작을 정의할 수 있습니다. 예를 들어, 특정 메서드가 호출될 때 반환해야 하는..
gradleimplementation 'net.sf.json-lib:json-lib:2.4:jdk15@jar'implementation 'commons-lang:commons-lang:2.6'implementation 'commons-logging:commons-logging:1.2'implementation 'commons-collections:commons-collections:3.2.2'implementation 'commons-beanutils:commons-beanutils:1.9.4'implementation 'net.sf.ezmorph:ezmorph:1.0.6'Object to JsonUser user = new User("Chris", 34);Car car1 = new C..
병렬 스트림 컬렉션에 parallelStream을 호출하면 병렬 스트림이 생성됨 병렬 스트림이란 각각의 스레드에서 처리할 수 있도록 스트림 요소를 여러 청크로 분할한 스트림 모든 멀티코어 프로세서가 각각의 청크를 처리하도록 할당 순차 스트림을 병렬 스트림으로 변환하기 순차 스트림에 parallel 메서드를 호출하면 함수형 리듀싱 연산이 병렬로 처리 public long parallelSum(long n) { return Stream.iterate(1L, i -> i+1) .limit(n) .parallel() .reduce(0L, Long::sum); } 반대로 sequential() 로 병렬 스트림을 순차 스트림으로 바꿀 수 있음 parallel 과 sequential 중 최종적으로 호출된 메서드가 전..
분할 Predicate를 분류 함수로 사용하는 특수한 그룹화 기능 분할 함수는 boolean을 반환하므로 Map의 키 형식은 Boolean Map partitionedMenu = menu.stream().collect(partitionBy(Dish::isVegetarian); //{false=[pork, beef, chicken, prawns, salmon], true=[french fries, rice, season fruit, pizza]} List vegetarianDishes = partitionedMenu.get(true);//채식 요리 List vegetarianDishes = menu.stream().filter(Dish::isVegetarian).collect(toList());//동일 분..
그룹화 groupingBy() 연산의 결과로 그룹화 함수가 반환하는 키, 각 키에 대응하는 스트림의 모든 항목 리스트를 값으로 갖는 Map 반환 Map dishesByType = menu.stream() .collect(groupingBy(Dish::getType)); Map dishesByCaloricLevel = menu.stream().collect(//복잡한 분류 기준이 필요한 상황 groupingBy(dish -> { if (dish.getCalories() 500) .collect(groupingBy(Dish::getType)); //{OTHER=[french fries, pizza], MEAT=[pork, beef]}, FISH 요리가 없으면 키 자체가 사라짐 Map caloricDishes..
컬렉터 Stream.collect 메서드의 인수로 스트림의 항목을 컬렉션으로 재구성 컬렉터로 스트림의 모든 항목을 하나의 결과로 합침 Collector 인터페이스 구현은 스트림의 요소를 어떤 식으로 도출할지 지정 collect로 결과를 수집하는 과정을 간단하면서도 유연한 방식으로 정의할 수 있음 스트림에 collect를 호출하면 스트림의 요소에 리듀싱 연산이 수행 리듀싱 연산을 이용해서 스트림의 각 요소를 방문하면서 컬렉터가 작업을 처리 Collectors 유틸리티 클래스는 자주 사용하는 Collector 인스턴스를 생성할 수 있는 정적 팩토리 메서드 제공 Collectos에서 미리 정의된 컬렉터 스트림 요소를 하나의 값으로 리듀스하고 요약 요소 그룹화 요소 분할 최대값과 최소값 검색 Collectors..
Stream데이터의 흐름Collection 형태로 구성된 데이터를 람다를 이용해 간결하고 직관적으로 프로세싱for, while 등 기존 loop 를 대체병렬처리 가능데이터 소스를 변경하지 않음재사용 불가컬렉션은 현재 자료구조가 포함되는 모든 값을 메모리에 저장하는 자료구조스트림은 요청할 때만 요소를 계산하는 고정된 자료구조내부반복은 데이터 표현과 하드웨어를 활용한 병렬성 구현을 자동으로 선택지연된 연산 : 중간 연산을 합친 다음에 합쳐진 중간 연산을 최종 연산으로 한번에 처리Filter만족하는 데이터만 걸러내는데 사용Predicate에 true를 반환하는 데이터만 존재하는 stream을 리턴중간처리 기능 Intermediate Operation, 여러가지 중간처리 이어붙이기 가능Stream filter ..