본문 바로가기

컴퓨터학원(복습)(수료)

자바(JAVA)기반 안드로이드 웹&앱 개발 24일차(Stream, Looping, LocalDate, ZoneId)

1. 스트림의 생성 : 스트림 생성에 필요한 데이터를 직접 전달

.1) Stream<T> 인터페이스에 정의되어 있는 static 메소드가 둘이 있다.

static <T> Stream<T> of(T t)

static <T> Stream<T> of(T...values)

※ Stream 생성 : 스트림 생성에 필요한 데이터를 직접 전달

☞ List<String> sl 을 통해서 생성된 스트림 sl 은 하나의 인스턴스만 존재한다.

☞ 그리고 그 인스턴스는 참조변수 sl이 참조하는 컬렉션 인스턴스이다.

.2) DoubleStream, IntStream, LongStream

static DoubleStream of(double...values) // DoubleStream의 메소드

static DoubleStream of(double t) // DoubleStream의 메소드

 

static IntStream of(int...values) // IntStream의 메소드

static DoubleStream of(double t) // IntStream의 메소드

 

static LongStream of(long...values) // LongStream의 메소드

static LongStream of(long t) // LongStream의 메소드

..(1) 위 메소드를 통해서 기본 자료형 데이터로 이뤄진 스트림을 생성하면, 불필요한

......오토박싱과 오토 언박싱을 피할 수 있다.

※ IntStream 예시 및 range 와 rangeClosed

 

 

☞ range, rangeClosed 에는 double형이 없다.

....두 실수 사이에 존재하는 값의 수는 셀 수 없이 많기 때문이다.

 

.2) 병렬 스트림으로 변경

..(1) 이미 스트림을 생성한 상태에서 병렬 스트림으로 생성하기를 원한다면

Stream<T> parallel() 을 호출하면 된다.

..(2) 마찬가지로 병렬스트림도 기본자료형들을 가지고 있다.

DoubleStream parallel()

IntStream parallel()

LongStream parallel()

 

.3) 스트림의 연결

..(1) concat을 생각하면 된다.

static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)

.☞ static <T> Stream<T> concat(Stream<T> a, Stream<T> b)

..(2) 마찬가지로 concat도 기본자료형들을 가지고 있다.

static DoubleStream concat(DoubleStream a, DoubleStream b)

static IntStream concat(IntStream a, IntStream b)

static LongStream concat(LongStream a, LongStream b)

※ 스트림 연결 예시

 

스트림의 중간 연산

.1) 맵핑(Mapping)에 대한 추가 정리

..(1) Stream<T>의 map 시리즈 메소드들

<R> Stream<R> map(Function<T, R> mapper)

IntStream mapToInt(ToIntFunction<T> mapper)

LongStream mapToLong(ToLongFunction<T> mapper)

DoubleStream mapToDouble(ToDoubleFunction<T> mapper)

..(2) Stream<T>의 flatMap 시리즈 메소드들

<R> Stream<R> flatMap(Function<T, Stream<R>> mapper)

IntStream flatMapToInt(Function<T, IntStream> mapper)

LongStream flatMapToLong(Function<T, LongStream> mapper)

DoubleStream flatMapToDouble(Function<T, DoubleStream> mapper)

☞ 메소드 호출 시 전달해야 할 람다식은 Stream<R> apply(T t) 이다.(Function<T, R>

※ FlatMapStream 예시

 

☞ flatMap에서 전달할 람다식에서는 ‘스트림을 생성하고 이를 반환해야 한다.

☞ 반면 map에 전달할 람다식에서는 스트림을 구성할 데이터만 반환하면 된다.

☞ public String[] split(String regex)

..☞ 인자로 전달된 구분자 정보를 기준으로 문자열 나누고, 이를 배열에 담아서 반환

 

.2) 정렬(sorted)

..(1) 정렬 기능을 제공하는 중간 연산 메소드들은 다음과 같다.

Stream<T> sorted(Comparator<? super T> comparator) // Stream<T>의 메소드

Stream<T> sorted() // Stream<T>의 메소드

IntStream<T> sorted() // IntStream의 메소드

LongStream<T> sorted() // LongStream의 메소드

DoubleStream<T> sorted() // DoubleStream의 메소드

※ IntStream & sorted 예시

 

.3) 루핑(Looping)

..(1) 스트림을 이루는 모든 데이터 각각을 대상으로 특정 연산을 진행하는 행위를 ‘루핑’

......이라고 한다.

..(2) forEach는 대표적인 루핑연산이고 ‘최종 연산’이다.

..(3) ‘중간 연산’인 루핑을 위한 메소들도 다음과 같이 존재한다.

Stream<T> peek(Consumer<? super T> action) // Stream<T>의 메소드

IntStream peek(IntConsumer action) // IntStream의 메소드

LongStream peek(LongConsumer action) // LongStream의 메소드

DoubleStream peek(DoubleConsumer action) // DoubleStream의 메소드

..(4) 중간연산 peek가 들어가면 최종연산이 있어도 반환하지 않는다.

......하지만, 최종연산이 있어야 중간연산이 ‘지연(Lazy) 처리’됨을 확인할 수 있다.

※ 중간연산 루핑 지연처리 예시

 

스트림의 최종연산

.1) sum(), count(), average(), min(), max()

.2) forEach

.3) allMatch, anyMatch, noneMatch

boolean allMatch(Predicate<? super T> predicate)

☞ 스트림의 데이터가 조건을 모두 만족하는가?

boolean anyMatch(Predicate<? super T> predicate)

☞ 스트림의 데이터가 조건을 하나라도 만족하는가?

boolean noneMatch(Predicate<? super T> predicate)

☞ 스트림의 데이터가 조건을 하나도 만족하지 않는가?

※ allMatch, anyMatch, noneMatch 예시

 

.4) collect

..(1) 한번 파이프라인에 흘려보낸 스트림은 되돌리거나 다른 파이프라인에 다시 흘려보낼 수

......없다. 때문에 필요하다면 파이프라인을 통해서 가공되고 걸러진 데이터를 최종 연산

......과정에서 별도로 저장해야 한다. 이때 collect 메소드를 호출하게 된다.

※ Collect 사용 예시

 

☞ (c,s)에서 c는 collect의 첫 번째 인자를 통해서 생성된 컬렉션 인스턴스이고,

....s는 스트림을 이루는 데이터들이다. 즉 이 문장을 통해서 컬렉션 인스턴스에

....스트림의 데이터가 저장된다.

 

시각과 날짜 관련 코드의 작성

.1) 시간이 얼마나 걸렸지? : Instant 클래스

※ Instant 클래스 예시

 

 

☞ Instant.now() : 현재 시각 정보를 담는다.

☞ getEopchSecond() : 1970-01-01 00:00:00을 기준으로 지나온 시간을 초 단위로 계산

☞ Duration : 시간(시각의 차)을 표현하는 클래스

 

.2) 오늘이 며칠이죠? : LocalDate 클래스

※ LocalDate 클래스 예시

 

☞ LocalDate.now() : 오늘의 날짜정보를 담은 인스턴스 생성

☞ minusDays(감소), minusYears(), minusMonths()

☞ Period.between : 두 날짜의 차

public int getYears()

public int getMonths()

public int getDays()

 

.3) 3시간 10분 뒤에 어때? : LocalTime 클래스

※ LocalTime 클래스 예시

 

 

☞ LocalTime.now() : 현재의 시각 정보를 담은 LocalTime 인스턴스 생성

☞ now.plusHours(2) : 시 정보를 2 증가

☞ plusMinutes(10); : 분 정보를 10 증가

☞ LocalTime 인스턴스도 변경 불가능한(immutable) 인스턴스이므로 위의 메소드들을

....통해 저장된 시각 정보를 바꾸면 새로운 인스턴스를 생성하는 것이다.

 

.4) 지금으로부터 22시간 35분 뒤의 시각과 날짜는? LocalDateTime 클래스

..(1) 시각정보와 날짜 정보를 동시에 나타낸다.

..(2) LocalDateTime 인스턴스도 변경 불가능한(immutable) 인스턴스이다.

..(3) plusXXX, minusXXX 메소드가 정의되어 있다.

※ LocalDateTime 인스턴스 간의 시각과 날짜의 차를 구하는 예시

 

시간대를 적용한 코드 작성 그리고 출력 포맷의 지정

.1) 시간대를 표현하는 ZoneId 클래스

..(1) ZoneId paris = ZoneId.of(“Europe/Paris”);

...☞ ZoneId 인스턴스를 생성하려면 그에 맞는 문자열 정보를 전달해야 한다.

※ ZoneId 문자열 정보 확인 예시

 

 

.2) 시간대를 반영한 ZonedDateTime 클래스

..(1) ZonedDateTime 인스턴스 생성 시 호출하는 대표적인 메소드 셋

public static ZonedDateTime now()

public static ZonedDateTime of(LocalDateTime localDateTime, ZoneId zone)

public static ZonedDateTime of

(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond, ZoneId zone)

※ ZonedDateTime 클래스 예시

 

 

.3) 날짜와 시각정보의 출력 포맷 지정

..(1) public String format(DateTimeFormatter formatter) 메소드를 사용한다.