티스토리 뷰

Backend/Java8

#32 Advanced Stream - forEach

RadderNepa 2022. 10. 21. 00:13

● 도입

- 기존에 사용하던 for문을 forEach로 대체할 수 있다.

void forEach(Consumer<? super T> action);

- 제공된 action을 Stream의 각 데이터에 적용해주는 종결 처리 method
- Consumer를 받기 때문에 return 값은 따로 있지 않다.
- Java의 iterable 인터페이스에도 forEach가 있기 때문에 Stream의 중간 처리가 필요없다면 iterable collection(Set, List 등)에서 바로 쓰는 것도 가능하다.
(= Stream 중간 처리(map, filter 등)를 사용하지 않는다면 Java의 iterable에도 forEach가 있기 때문에 굳이 Stream을 만들 필요 없이 바로 Set, List 등에서 forEach를 호출해도 된다.)

 

 

● 실습

1.

package com.fastcampus.functionalprogramming.chapter8;

import java.util.Arrays;
import java.util.List;

import com.fastcampus.functionalprogramming.chapter8.model.User;

public class Chapter8Section9 {
	public static void main(String[] args) {
		List<Integer> numbers = Arrays.asList(3, 5, 2, 1);
		
		numbers.stream().forEach(number -> System.out.println("Number is " + number));
		
		// Stream 중간 처리를 하지 않을 경우에는 굳이 Stream으로 만들 필요 없이 Set, List에서 바로 forEach를 호출하면 된다.
		List<Integer> numbers2 = Arrays.asList(3, 5, 2, 1);
		numbers2.forEach(number -> System.out.println("No Stream Number is " + number));
	}
}

 

2.

package com.fastcampus.functionalprogramming.chapter8.service;

import com.fastcampus.functionalprogramming.chapter8.model.User;

public class EmailService {
	// 친구랑 놀아라
	public void sendPlayWithFriendsEmail(User user) {
		user.getEmailAddress().ifPresent(email -> 
			System.out.println("Sending 'Play With Friends' email to " + email));
	}
	// getEmailAddress method의 반환타입 = Optional<String>
	
	// 친구 좀 만들어
	public void sendMakeMoreFriendsEmail(User user) {
		user.getEmailAddress().ifPresent(email -> 
			System.out.println("Sending 'Make More Friends' email to " + email));
	}
	// getEmailAddress method의 반환타입 = Optional<String>
	
	// 이메일 확인 메세지 전송
	public void sendVerifyYourEmailEmail(User user) {
		user.getEmailAddress().ifPresent(email -> 
			System.out.println("Sending 'Verify Your Email' email to " + email));
	}
	// getEmailAddress method의 반환타입 = Optional<String>
}
package com.fastcampus.functionalprogramming.chapter8.model;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

public class User {
	private int id;
	private String name;
	private String emailAddress;
	private boolean isVerified;
	private LocalDateTime createdAt;
	private List<Integer> friendUserIds;
	
	public int getId() {
		return id;
	}
	
	public User setId(int id) {
		this.id = id;
		return this;
	}
	
	public String getName() {
		return name;
	}
	
	public User setName(String name) {
		this.name = name;
		return this;
	}
	
	public Optional<String> getEmailAddress() {
		return Optional.ofNullable(emailAddress);
	}
	
	public User setEmailAddress(String emailAddress) {
		this.emailAddress = emailAddress;
		return this;
	}
	
	public boolean isVerified() {
		return isVerified;
	}
	
	public User setVerified(boolean isVerified) {
		this.isVerified = isVerified;
		return this;
	}
	
	public LocalDateTime getCreatedAt() {
		return createdAt;
	}
	
	public User setCreatedAt(LocalDateTime createdAt) {
		this.createdAt = createdAt;
		return this;
	}
	
	public List<Integer> getFriendUserIds() {
		return friendUserIds;
	}
	
	public User setFriendUserIds(List<Integer> friendUserIds) {
		this.friendUserIds = friendUserIds;
		return this;
	}
	
	@Override
	public String toString() {
		return "User [id=" + id + ", " + (name != null ? "name=" + name + ", " : "")
				+ (emailAddress != null ? "emailAddress=" + emailAddress + ", " : "") + "isVerified=" + isVerified
				+ ", " + (friendUserIds != null ? "friendUserIds=" + friendUserIds : "") + "]";
	}
}

 

3. index가 필요한 for문의 경우

for (int i = 0; i < userList.length; i++) {
	User user = userList.get(i);
	......
}

- forEach를 이용하면 for문을 대체할 수 있다고 했다.

- 그렇다면 만약 위와 같이 반복문을 사용하면서 인덱스 번호(i)가 필요한 경우에는 forEach를 어떻게 사용해야 할까?

- 이때 바로 IntStream을 사용하면 된다.

package com.fastcampus.functionalprogramming.chapter8;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import com.fastcampus.functionalprogramming.chapter8.model.User;
import com.fastcampus.functionalprogramming.chapter8.service.EmailService;

public class Chapter8Section9 {
	public static void main(String[] args) {
		User user1 = new User()
				.setId(101)
				.setName("Alice")
				.setVerified(true)
				.setEmailAddress("alice@fastcampus.co.kr");
	    User user2 = new User()
	    		.setId(102)
	    		.setName("Bob")
	    		.setVerified(false)
	    		.setEmailAddress("bob@fastcampus.co.kr");
	    User user3 = new User()
	    		.setId(103)
	    		.setName("Charlie")
	    		.setVerified(false)
	    		.setEmailAddress("charlie@fastcampus.co.kr");
	    
	    EmailService emailService = new EmailService();
		
	    // index가 필요한 for문의 경우
	    List<User> users3 = Arrays.asList(user1, user2, user3);

	    // 기존 for문
	    for (int i = 0; i < users3.size(); i++) {
	    	User user = users3.get(i);
	    	System.out.println("이름 : " + user.getName() + " / 인덱스 번호 : " + i);
		};
	    
	    /*
	     * - IntStream : 입력한 범위의 숫자를 Stream을 통해서 하나씩 제공해준다.
	     * (0, users3.size()) = (왼쪽에 입력한 범위 포함 O, 오른쪽에 입력한 범위 포함 X)
	     */
	    IntStream.range(0, users3.size()).forEach(i -> {
	    	User user = users3.get(i);
	    	System.out.println("이름 : " + user.getName() + " / 인덱스 번호 : " + i);
	    });
	}
}

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함