본문 바로가기
Java

[Java] 람다식 + Stream API

by doozzuri 2020. 10. 5.
반응형

1. 람다식

참조 : https://jdm.kr/blog/181

 

자바 람다식(Lambda Expressions in Java) :: JDM's Blog

자바 8에서 람다식(Lambda Expressions)이 추가 되었습니다. 이번 포스팅은 간단하게 람다식에 대해 알아보고자 합니다. Lambda Expressions 람다식을 간단히 정의하면 다음과 같습니다. 식별자 없이 실행 �

jdm.kr

 

2. Stream API

▶ Get Stream

Arrays.asList(1,2,3).stream(); // 일반적인 stream
Arrays.asList(1,2,3).parallelStream(); // 병렬 stream

 

▶ stream의 생성

 //컬렉션을 메서드로 변환
Stream<String> stream = Stream.of(contents.split("[\\P{L}]+"));
//of 메서드는 가변 인자 파라미터를 받아 stream 을 생성
Stream<String> stream = Stream.of("Using", "Stream", "API", "From", "Java8"); 
//배열의 일부에서 stream 생성
String[] wordArray = {"Using", "Stream", "API", "From", "Java8"};
Stream<String> stream = Arrays.stream(wordArray, 0, 4); // Arrays.stream(array, from, to);
//요소가 없는 stream 생성
Stream<String> stream = Stream.empty();
//무한 stream을 만드는  generate 정적메서드(Supplier<T>)
Stream<String> stream = Stream.generate(() -> "Stream");
Stream<Double> stream = Stream.generate(Math::random);


//Stream.generate()는 Argument로 함수를 받습니다. 함수에서 리턴되는 객체가 스트림으로 생성됩니다. 
//함수는 무한히 호출되기 때문에 무한한 길이의 스트림이 생성됩니다.
Stream<String> stream3 = Stream.generate(() -> "Echo").limit(5);
System.out.println("stream3");
stream3.forEach(System.out::println);

//출력
stream3
Echo
Echo
Echo
Echo
Echo
//무한 스트림을 만드는 iterate 정적 메서드(UnaryOperator<T>)
Stream<BigInteger> stream = Stream.iterate(BigInteger.ZERO, n -> n.add(BigInteger.ONE));


//Java9에서는 추가로 스트림 종료 조건을 인자로 받는 iterate() 메서드가 Stream 클래스에 추가됨. 
//첫번째 인자는 초기 값이고, 두번째 인자는 종료 조건을 나타내는 람다 함수, 
//세번째 인자는 값이 어떻게 변경될지를 나타내는 람다 함수입니다.
int sum = Stream.iterate(0, i -> i < 10, i -> i + 1)
			.filter(i -> i % 2 == 1)
			.mapToInt(Integer::intValue)
			.sum();
System.out.println("합: " + sum); // 합: 25

 

 

▶ forEach

Arrays.asList(1,2,3).stream()
			.forEach(System.out::println); // 1,2,3

 

▶ map

Arrays.asList(1,2,3).stream()
			.map(i -> i*i)
			.forEach(System.out::println); // 1,4,9

 

▶ limit

선언한 인덱스까지 요소를 추출해 새로운 stream을 만듦.

Arrays.asList(1,2,3).stream()
			.limit(1)
			.forEach(System.out::println); // 1

 

▶ skip

선언한 인덱스까지의 요소를 제외하고 새로운 stream을 만.

Arrays.asList(1,2,3).stream()
			.skip(1)
			.forEach(System.out::println); // 2,3

 

▶ filter

stream의 요소를 비교하고 비교문을 만족하는 요소로만 구성된 stream 반환하고 반복하여 출력.

Arrays.asList(1,2,3).stream()
			.filter(i-> 2>=i)
			.forEach(System.out::println); // 1,2

 

▶ flatMap

stream 내부에 있는 객체들을 연결한 steam 반환.

Arrays.asList(Arrays.asList(1,2),Arrays.asList(3,4,5),Arrays.asList(6,7,8,9)).stream()
			.flatMap(i -> i.stream())
			.forEach(System.out::println); // 1,2,3,4,5,6,7,8,9

 

▶ reduce

앞에서부터 차례차례 계산식에 맞춰 계산하여 단일요소로 반환.

Arrays.asList(1,2,3).stream()
			.reduce((a,b)-> a-b)
			.get(); // -4

 

리덕션 메서드는 stream을 프로그램에서 사용할 수 있는 값으로 리듀스한다. 리덕션은 최종 연산이다.

최종 연산을 적용한 후에는 stream을 사용할 수 없다.

 

(1) stream.count()

stream 요소의 갯수 리턴

long count = stream.count();

 

(2) stream.max()

stream 요소의 최대값 리턴

Optional<String> max = stream.max(String::compareToIgnoreCase);
if (max.isPresent()) {
    System.out.println("max: " + max.get());
}

 

(3) stream.min()

stream 요소의 최소값 리턴

Optional<String> min = stream.min(String::compareToIgnoreCase);
if (min.isPresent()) {
    System.out.println("min: " + min.get());
}

 

(4) stream.findFirst()

stream 요소에서 비어있지 않은 첫번째 값을 반환.

Optional<String> startWithS = stream.filter(s -> s.startsWith("S")).findFirst();
if (startWithS.isPresent()) {
    System.out.println("findFirst: " + startWithS.get());
}

 

(5) stream.findAny()

stream 요소에서 순서에 상관없이 일치하는 값 하나를 반환.

Optional<String> startWithS = stream.filter(s -> s.startsWith("S")).findAny();
if (startWithS.isPresent()) {
    System.out.println("findAny: " + startWithS.get());
}

 

(6) stream.anyMath()

stream 요소에서 일치하는 요소가 있는지 여부를 반환.

boolean aWordStartWithS = stream.anyMatch(s -> s.startsWith("S"));

 

참조 : iloveulhj.github.io/posts/java/java-stream-api.html

 

[JAVA] 스트림 API

이 포스트는 “가장 빨리 만나는 자바8”의 “2장. 스트림 API”를 학습한 내용으로 이루어져 있습니다. 반복에서 스트림 연산으로 스트림과 컬렉션의 차이 스트림은 요소들을 보관하지 않는다.

iloveulhj.github.io

 

3. 람다식 + Stream API

store 의 값들로 stream의 요소를 생성하고, name과 비교하여 순서에 상관없이 일치하는 값 하나를 반환.

@Override
public Optional<Member> findByName(String name) {
    return store.values().stream()
            .filter(member -> member.getName().equals(name))
            .findAny();
}

 

 

반응형

'Java' 카테고리의 다른 글

[Java] 03. 조건문 / 반복문  (0) 2020.12.04
[Java] 02. 자바의 연산자  (0) 2020.12.04
[Java] 01. 변수와 자료형  (0) 2020.12.03
[Java] 00. 기본 용어 정리  (0) 2020.12.03
[Java] Optional 객체  (0) 2020.10.05