1. 람다식
자바 람다식(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 |