본문 바로가기

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

자바(JAVA)기반 안드로이드 웹&앱 개발 23일차(메소드 참조, map, flatMap, Optional, Stream, Filtering, Mapping, reduce)

제가 생각했을 때 중요하지 않은 부분이나.. 구체적인 설명은 생략하였습니다..

왜냐하면.. 지금 머리로는 일단 외우는게 먼저라고 생각해서입니다 ㅠㅠ

1. 메소드 참조의 4가지 유형과 메소드 참조의 장점

.1) 메소드 참조의 유형

..(1) static 메소드의 참조

※ 람다식을 작성한 static 메소드 참조 예시

☞ 이미 정의되어 있는 메소드를 사용하여 람다식을 작성할 때, 자바 8에서부터는 메소드 정보만 전달 할 수 있도록 하고 있다.

☞ Consumer<List<Integer>> c = l -> Collections.reverse(l); 를

Consumer<List<Integer>> c = Collections::reverse; 로 바꿀 수 있다.

☞ ‘메소드 참조’에서 람다식에는 있는 인자 전달에 대한 정보를 생략할 수 있는 이유는 “accept 메소드 호출 시 전달되는 인자를 reverse 메소드를 호출하면서 그대로 전달한다.”라는 약속에 근거한다. 이러한 약속이 없었다면 메소드 참조라는 것이 존재할 수 없다.

 

..(2) 참조변수를 통한 인스턴스 메소드 참조

※ 참조변수를 통한 인스턴스 메소드 참조 예시

 

☞ 람다식에서 접근 가능한 참조변수는 final로 선언되었거나 effectively final이어야 한다.

☞ Collection<E> 인터페이스는 Iterable<T>를 상속한다. 따라서 컬랙션 클래스들은

....Itreable<T>를 대부분 구현하게 되는데, forEach가 디폴트 메소드로 정의되어 있다.

☞ 즉 메소드 안에 action.accpet(t)를 실행하고 이에 맞는 메소드 중 하나가

....System.out.println이다.

 

※ 인스턴스 메소드 참조 예시 2

 

..(3) 클래스 이름을 통한 인스턴스 메소드 참조

..(4) 생성자 참조

※ 생성자 참조 예시

 

☞ 람다식을 이루는 문장이 ‘단순히 인스턴스의 생성 및 참조 값의 반환’일 경우,

....메소드 참조 형태로 바꿀 수 있다.

 

Optional 클래스

.1) Optional 클래스의 기본적인 사용방법

..(1) Optional은 멤버 value에 인스턴스를 저장하는 일종의 래퍼 클래스이다.

※ Optional 클래스 기본적인 사용방법 예시

 

☞ isPresent 는 내용물이 존재하면 true 를 반환하고 get 통한 내용물을 반환한다.

☞ 위 사항을 ifPresent로 변경할 수 있다.

..(2) map 메소드의 소개 (if ~ else 문 대신가능)

※ map 메소드 사용 예시

 

☞ map은 반환할 때 Optional 인스턴스로 감싸서 반환 값을 반환한다.

..(3) orElse 메소드의 소개 (if ~ else 문 대신가능)

※ orElse 메소드 사용 예시

 

☞ Optional 인스턴스에 저장된 내용물을 반환한다. 단 저장된 내용물이 없을 때,

....대신해서 반환할 대상을 지정할 수 있다는 점에서 get 메소드와 차이가 있다.

 

..(4) flatMap 메소드

※ flatMap 메소드 사용 예시

 

☞ map은 람다식이 반환하는 내용물을 Optional 인스턴스로 감싸는 일을 알아서 해주지만,

...,flatMap은 알아서 해주지 않기 때문에 이 과정을 람다식이 포함하고 있어야 한다.

☞ Optional 인스턴스를 클래스의 멤버로 두는 경우에 유용하게 사용할 수 있다.

....get 메소드를 한번만 쓰면 되기 때문이다.

 

Optional과 OptionalXXX와의 차이점

.1) OptionalInt, OptionalLong, OptionalDouble 은 박싱을 안해도 되기 때문에

...성능면에서 유리하다.

※ OptionalInt 사용 예시

스트림(Stream)

.1) 스트림 = 데이터의 흐름이다, 중간연산과 최종연산을 가지고 있다.

..(1) 중간연산 : 마지막이 아닌 위치에서 진행이 되는 연산

..(2) 최종 연산 : 마지막에 진행이 되어야 하는 연산

※ Stream 사용 예시

 

.2) 스트림의 특성

※ Stream 특성 예시

 

 

☞ 메소드 호출이 filter에서 sum으로 이어지지만, sum이 호출될 때까지 filter의 호출

....결과는 스트림에 반영되지 않는다. 즉 최종 연산인 sum이 호출되어야 filter의 호출

....결과가 스트림에 반영되고, 이어서 sum의 호출 결과가 스트림에 반영된다.

 

.3) 스트림 배열 생성

※ 스트림 배열 예시

 

☞ 중간연산 없이 바로 최종연산으로 진행할 수 있다.

 

.4) 스트림 기본자료형

public static IntStream stream(int[] array)

public static IntStream stream(int[] array, int startInclusive, int endExclusive)

public static DoubleStream stream(double[] array)

public static DoubleStream stream(double[] array, int startInclusive, int endExclusive)

public static LongStream stream(double[] array)

public static LongStream stream(double[] array, int startInclusive, int endExclusive)

 

.4) 켈럭션 인스턴스로 스트림 생성

※ 컬렉션 인스턴스로 스트림 생성 예시

 

스트림 필터링(Filtering)과 맵핑(Mapping)

.1) 핕터링(Filtering)

Stream<T> filter(Predicate<? super T> predicate) // Stream<T>에 존재

..(1) 매개변수 형이 Predicate 이므로 boolean test(T t) {Predicate의 추상메소드}

......구현을 람다식 인자로 전달해야 한다.

※ 필터링 사용 예시

 

.2) 맵핑(Mapping) 1

..(1) 맵핑도 필터링과 마찬가지로 중간 연산이다.

..(2) 맵핑을 진행하면 스트림의 데이터 형이 달라지는 특징이 있다.

※ 맵핑 사용 예시 (스트링 -> 인트)

 

..(3) mapToInt, mapToLong, mapToDouble을 가지고 있다.

 

.3) 맵핑(Mapping) 3

※ 필터링 후 맵핑 예시

 

리덕션과 reduce 메소드

.1) 리덕션(Reduction)은 데이터를 축소하는 연산을 뜻한다.

※ 리덕션 사용 예시

 

☞ reduce(“”, lc); 간단하게 “”를 첫번째 인자로 전달하여 값을 비교한다고 생각하면 된다.

 

.2) 병렬 스트림(Parallel Streams)

..(1) 하나의 작업을 둘 이상의 작업으로 나누어서 동시에 진행한다.

..(2) 위 예제에서 ls.parallelStream() 으로 수정만 하면 된다.

..(3) 병렬 처리의 핵심은 연산의 횟수를 줄이는데 있지 않고 연산의 단계를 줄이는 데 있다.