반응형
자바 8 이상부터 가능한 Stream 기능 중, map 에 대한 내용이다.
map() 동작 및 예제
1. .stream().map(Function<? super T, ? extends R> mapper)
map을 사용할 때 매개변수로 각 요소에 적용할 함수를 넣어준다. 그러면 주어진 함수의 결과 값으로 만들어진 결과 스트림을 return 한다. ( stateless 이기 때문에 값을 저장하지 않는다. )
이는, reduce() 와 filter() 를 더해 더욱 유용하게 사용할 수 있다.
2. map() 으로 각 수의 세제곱 구하기
public class MapEx {
public static void main(String[] args) {
List<Integer> numbers = List.of(1,2,3,4,5);
numbers.stream()
.map(n -> n*n*n) // ★
.forEach(System.out::println);
// 출력
// 1
// 8
// 27
// 64
// 125
}
stream 으로 전달된 numbers의 요소들이 각각 세제곱되어 출력되는 것을 확인할 수 있다.
3. map() 으로 객체에서 원하는 필드만 출력/추출하기
import java.util.ArrayList;
import java.util.List;
class Member{
private Long id;
private String name;
private Integer age;
private String tel;
..
// Constructor, Getter 생략
}
public class MapEx {
public static void main(String[] args) {
Member member1 = new Member(1L, "홍길동", 25, "010-1234-5678");
Member member2 = new Member(2L, "홍길순", 30, "010-1256-5678");
Member member3 = new Member(3L, "둘리", 7, "010-1278-5678");
Member member4 = new Member(4L, "도우너", 5, "010-12690-5678");
List<Member> members = new ArrayList<>();
members.add(member1);
members.add(member2);
members.add(member3);
members.add(member4);
/* 1. 리스트로 name 필드만 추출하기 */
List<String> memberNames = members
.stream()
.map(Member::getName)
.toList();
/* 2. name 필드만 출력하기 */
members.stream()
.map(Member::getName)
.forEach(System.out::println);
}
}
임의로 id, name, age, tel 을 필드로 갖는 Member class 구현 및 임의의 데이터 4개를 생성하여 리스트에 더했다.
간혹 객체의 특정 필드만 필요한 경우가 있는데 이럴 때 map() 은 아주 유용하다.
메서드 표현식으로 Member 클래서의 getter를 호출하여 해당 인스턴스의 이름이 return 되고 해당 결과 값들은 리스트로 반환이 된다. 이를 사용하고 싶다면 toList() 를 덧붙여 값을 저장할 수 있다.
4. 나이가 20세 이상인 회원 이름 출력하기 with filter()
public class MapEx {
public static void main(String[] args) {
..
members.stream()
.filter(m -> m.getAge() >= 20)
.map(Member::getName)
.forEach(System.out::println);
}
}
위의 예제를 그대로 활용하였다.
정리
문법을 인스턴스에 적용해보려는 노력이 부족했던 것 같아 이번에는 인스턴스를 활용해보았다.
반응형
'JAVA' 카테고리의 다른 글
[이펙티브자바] Item1. 생성자 대신 정적 팩터리 메서드를 고려하라 (0) | 2023.10.15 |
---|---|
[Java] Access Level 에 관하여 (0) | 2023.09.24 |
[Java] record 사용방법 및 예제 (0) | 2023.08.06 |
[Java] stream.filter() 동작 및 예제 (0) | 2023.07.19 |
[Java] stream.reduce() 동작 및 예제 (2) | 2023.07.11 |