[JAVA] JAVA 8

dbswlekq·2023년 3월 20일

람다식 문법(Lambda expression syntax)

자바에서의 람다식은 다음과 같은 문법으로 사용할 수 있다.

(파라미터 목록) -> { 람다식 바디 }

람다식의 시작 부분에는 파라미터들을 명시할 수 있다. 비교적 엄격한 타입 제한을 두고 있는 자바지만 람다의 파라미터를 추론할 수 있는 경우에는 타입을 생략할 수도 있다. 위에서 봤던 '(a, b) -> a + b' 람다식에서도 파라미터인 a, b 의 타입이 명시되지 않았다. 추론가능한 타입을 생략하면서 간결함을 얻었다. (추론할 수 없는 경우에는 메소드 파라미터처럼 타입도 명시해줘야한다.)

파라미터가 하나인 경우 괄호를 생략 할 수도 있다. 제곱을 구하는 람다식을 다음과 같이 작성할 수 있다.

a -> a * a

하나의 파라미터만 필요하기 때문에 괄호를 생략했다.

람다식의 바디가 하나의 표현식인 경우에는 중괄호를 생략할 수 있다. 위에서 봤던 람다들은 하나의 식으로 구성되어 있기 때문에 중괄호를 생략했다. 이 때, 세미콜론은 붙이지 않는다.

다만, 라다식의 바디에 'return' 문이 있을 경우 중괄호를 생략할 수 없다.

(a, b) -> { return a > b ? a : b }

Stream

  1. 데이터를 변경하지 않는다.
    • 원본 데이터로부터 데이터를 읽기만 할 뿐, 원본 데이터 자체를 변경하지 않는다.
  2. 일회용이다.
    • 한 번 사용하면 닫혀서 재사용이 불가능하다. 필요하다면 정렬도니 결과를 컬렉션이나 배열에 담아 반환할 수 있다.
  3. 내부에서 반복적인 작업으로 처리한다.
    • 내부 반복이라는 것은 반복문을 메서드의 내부에 숨길 수 있다는 것을 의미한다.

Stream 구조

  1. Stream 생성
  2. 중개 연산
  3. 최종 연산

중개 연산은 연산 결과를 Stream 형태로 반환하기 때문에 연속적으로 연결해서 사용할 수 있다.

데이터소스객체집합.Stream생성().중개연산().최종연산();

String[] intArray = { "hello world", "yellow", "green", "hello", "red", "blue" };
Set<String> set = Arrays.asList(intArray) // intArray를 List로 변형하고
		.stream() // 1. stream 생성
		.filter(e -> e.startsWith("hello")) // 2. 중개 연산 - hello로 시작하는 단어
		.collect(Collectors.toSet()); // 3. 최종 연산 - 중개 연산을 통해 가공된 stream을 모아줌
set.forEach(e -> System.out.println(e));

중개 연산

  1. Stream 필터링 : filter(), distinct()
  2. Stream 변환 : map(), flatMap()
  3. Stream 제한 : limit(), skip()
  4. Stream 정렬 ; sorted()
  5. Stream 연산 결과 확인 : peek()
// map(), flatMap()
Stream<String> stream = Stream.of("HTML", "CSS", "JAVA", "JAVASCRIPT");
stream.map(s -> s.toLowerCase()).forEach(System.out::println); //해당 스트림의 요소들을 주어진 함수에 인수로 전달하여, 
																//그 반환값들로 이루어진 새로운 스트림을 반환
	/*
	* html
	* css
	* java
	* javascript
	*/

최종 연산

  1. 요소의 출력 : forEach()
  2. 요소의 소모 : reduce()
  3. 요소의 검색 : findFirst(), findAny()
  4. 요소의 검사 : anyMatch(), allMatch(), noneMatch()
  5. 요소의 통계 : count(), min(), max()
  6. 요소의 연산 : sum(), average()
  7. 요소의 수집 : collect()
// forEach()
Stream<String> stream = Stream.of("넷", "둘", "셋", "하나");
stream.forEach(System.out::println); // 각 요소를 출력 
	 /*
  	  * 넷
  	  * 둘
  	  * 셋
  	  * 하나
 	  */

// collect()
Stream<String> stream = Stream.of("넷", "둘", "하나", "셋");
List<String> list = stream.collect(Collectors.toList()); // 스트림을 리스트로 변환
Iterator<String> iter = list.iterator();
while(iter.hasNext()) {
    System.out.print(iter.next() + " "); // 넷 둘 하나 셋
}

참고
Java - Lambda Expression(람다식)이란?
[Java] 자바8의 람다식(lambda expression)
[Java] Java 8 Stream이란?

0개의 댓글