기본 콘텐츠로 건너뛰기

라벨이 이것이 자바다인 게시물 표시

Chapter16 스트림과 병렬 처리

스트림  - 컬렉션(배열 포함)의 저장 요소를 하나씩 참조해서 람다식(함수적-스타일(functional-style))으로 처리하는 반복자               람다식으로 요소 처리 코드를 제공 : stream이 제공하는 대부분의 요소 처리 메소드는 함수적 인터페이스 매개 타입을 가지기 때문에 람다식 또는 메소드 참조를 이용해서 요소 처리 내용을 매개값으로 전달               내부 반복자를 사용하므로 병렬 처리가 쉬움 : 외부 반복자는 개발자가 코드로 직접 컬렉션의 요소를 반복해서 가져오는 코드패턴(index를 이용하는 for문 Iterator를 이용하는 while문은 모두 외부 반복자를 이용), 내부 반복자는 컬렉션 내부에서 요소들을 반복시키고, 개발자는 요소당 처리해야 할 코드만  제공하는 코드 패턴, 내부 반복자의 장점은 어떻게 요소를 반복시킬 것인가는 컬렉션에 맡기고 개발자는 요소 처리 코드에만 집중, 내부 반복자는 요소들의 반복 순서를 변경하거나, 멀티 코어 CPU를 활용하기 위해 요소들을 분배시켜 병렬 작업을 할 수 있게 도와주기 떄문에 하나씩 처리하는 순차적 외부 반복자보다는 효율적으로 요소를 반복시킬 수 있음                              병렬 처리 : 한 가지 작업을 서브 작업으로 나누고, 서브 작업들을 분리된 스레드에서 병렬적으로 처리하는 것, 병렬 처리 스트림을 이용하면 런타임 시 하나의 작업을 서브 작업으로 자동으로 나누고, 서브 작업의 결과를 자동으로 결합해서 최종 결과물을 생성               스트림은 중간 처리와 최종 처리를 할 수 있음 : 중간 처리에서는 매핑, 필터링, 정렬을 수행하고 최종 처리에서는 반복, 카운팅, 평균, 총합 등의 집계 처리를 수행 스트림의 종류 - java.util.stream 패키지에는 BaseStream 인터페이스를 부모로 해서 하위로 Stream, IntStream, LongStream, DoubleStream이 있음 //리스트 컬렉션에서 스트림 얻기 Strea

Chapter15 컬렉션 프레임워크

  컬렉션 프레임워크 Collection               List               순서를 유지하고 저장               ArrayList, Vector, LinkedList                                                         중복 저장 가능                                  Set               순서를 유지하지 않고 저장       HashSet, TreeSet                                                        중복 저장 안 됨 Map                                               키와 값의 쌍으로 저장               HashMap, Hashtable, TreeMap, Properties                                                       키는 중복 저장 안 됨 List 컬렉션 - 객체를 인덱스로 관리(저장 순서를 유지)하고 null도 저장 가능 list. add ( "홍길동" ); //맨끝에 객체 추가 list. add ( 1 , "신용권" ); //지정된 인덱스에 객체 삽입 String str = list. get ( 1 ); //인덱스로 객체 찾기 list. remove ( 0 ); //인덱스로 객체 삭제 list. remove ( "신용권" ); //객체 삭제                               ArrayList - 배열과 다르게 객체를 저장할 용량이 증가하면 자동으로 증가, 인덱스의 객체를 제거하면 바루 뒤 인덱스부터 마지막 인덱스까지 1씩 당겨지고 객체를 삽입하면 반대로 해닥 인덱스부터 마지막 인덱스까지 1씩 밀림, 빈번한 객체 삭제와 삽입은 LinkedList가

Chapter14 람다식

  람다식 람다식 기본 문법 - (타입 매개변수, ...) -> { 실행문; ...} ( int a) -> {System. out . println (a);} //매개 변수 타입은 런타임 시에 대입되는 값에 따라 자동으로 인식되기에 타입을 제거 (a) -> {System. out . println (a);} //하나의 매개 변수만 있으면 괄호()를 생략, 하나의 실행문만 있다면 중괄호{}도 생략 a -> System. out . println (a) //매개 변수가 없다면 람다식에서 매개 변수 자리가 없어지므로 ()를 반드시 사용 () -> { 실행문 ; ...} //중괄호{}를 실행하고 결과값을 리턴해야 할때는 (x,y) -> { return x+y;}; //중괄호{}에 return문만 있을 경우, return문 생략 (x,y) -> x+y 함수적 인터페이스(@FunctionalInterface) - 두 개 이상의 추상 메소드가 선언된 인퍼테이스가 아닌 하나의 추상 메소드가 선언된 인터페이스, @FunctionalInterface어노테이션을 붙이면 두 개 이상의 추상 메소드가 선언되면 오류가뜸 클래스 멤버와 로컬 변수 사용 - 클래스의 멤버(필드와 메소드)는 제약 사항없이 사용 가능하지만, 로컬 변수는 제약 사항이 따름           클래스의 멤버 사용 - 익명 객체 내부에서 this는 익명 객체의 참조지만, 람다식에서 this는 람다식을 실행한 객체의 참조          로컬 변수 사용 - 바깥 클래스의 필드나 메소드는 제한 없이 사용 가능하지만, 메소드의 매개 변수 또는 로컬 변수를 사용하면 이 두 변수는 final 특성을 가져야 함, 따라서 매개 변수 또는 로컬 변수를 람다식에서 읽는 것은 허용 되지만, 람다식 내부 또는 외부에서 변경할 수 없음 표준 API의 함수적 인터페이스 - 함수적 인터페이스는 java.util.function표준 API 패키지로 제공함               Consume