ConcurrentHashMap 동시성 친화적 내부 자료구조의 특정 부분만 잠궈 동시 추가, 갱신 작업 허용 동기화된 HashMap 보다 읽기 쓰기 연산 성능이 월등 forEach : 각(키, 값) 쌍에 주어진 액션을 수행 forEach, forEachKey, forEachValue, forEachEntry reduce : 모든(키, 값) 쌍을 제공된 reduce 함수를 이용해 결과로 합침 reduce, reduceKeys, reduceValues, reduceEntries search : null이 아닌 값을 반환할 때까지 각(키, 값) 쌍에 함수를 적용 search, searchKeys, searchValues, searchEntries 계산이 진행되는 동안 바뀔 수 있는 객체, 값, 순서 등에 의존..
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..