•
게시판 관련 기능을 담은 인터페이스 구현 로직
package com.practice;
import java.util.List;
import java.util.Map;
public interface PostSystem {
// 특정 작성자(author)가 작성한 게시물들을 필터링하여 반환하는 메소드
List<Post> filterPostsByAuthor(List<Post> posts, String author);
// 모든 게시물의 댓글을 추출하여 리스트로 반환하는 메소드
List<Comment> getAllComments(List<Post> posts);
// 모든 게시물의 제목을 추출하여 리스트로 반환하는 메소드
List<String> getAllPostTitles(List<Post> posts);
// 특정 키워드(keyword)를 포함하는 게시물들을 필터링하여 반환하는 메소드
List<Post> filterPostsByKeyword(List<Post> posts, String keyword);
// 각 게시물의 댓글 수를 계산하여 맵 형태로 반환하는 메소드
// 게시물 ID를 키로 하고 댓글 수를 값으로 하는 맵
Map<Integer, Integer> getCommentCountByPost(List<Post> posts);
// 최신 게시물 3개를 추출하여 리스트로 반환하는 메소드
List<Post> getLatestPosts(List<Post> posts);
// 게시물 번호 중 가장 높은 게시물 번호를 반환하는 메소드
int getHighestPostId(List<Post> posts);
// 게시물 입력 받기 메소드
void insertPost(List<Post> pList);
}
Java
복사
•
인터페이스에서 구현한 메소드의 구체적인 동작 구현을 정리한 코드
package com.practice;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
public class PostSystemImpl implements PostSystem {
// 특정 작성자(author)가 작성한 게시물들을 필터링하여 반환하는 메소드
@Override
public List<Post> filterPostsByAuthor(List<Post> posts, String author) {
return posts
.stream()
.filter(post -> post.getAuthor().equals(author))
.collect(Collectors.toList());
}
// 모든 게시물의 댓글을 추출하여 리스트로 반환하는 메소드 - flatMap 활용하여 stream 변환
@Override
public List<Comment> getAllComments(List<Post> posts) {
return posts
.stream()
.flatMap(post -> post.getComments().stream()) // stream으로 변환
.collect(Collectors.toList());
}
// 모든 게시물의 제목을 추출하여 리스트로 반환하는 메소드
@Override
public List<String> getAllPostTitles(List<Post> posts) {
return posts.stream()
.map(Post::getTitle)
.collect(Collectors.toList());
}
// 특정 키워드(keyword)를 포함하는 게시물들을 필터링하여 반환하는 메소드 - 제목 or 내용 포함
@Override
public List<Post> filterPostsByKeyword(List<Post> posts, String keyword) {
return posts.stream()
.filter(post -> post.getContent().contains(keyword) || post.getTitle().contains(keyword))
.collect(Collectors.toList());
}
// 각 게시물의 댓글 수를 계산하여 맵 형태로 반환하는 메소드
// 게시물 ID를 키로 하고 댓글 수를 값으로 하는 맵
@Override
public Map<Integer, Integer> getCommentCountByPost(List<Post> posts) {
return posts
.stream()
.collect(Collectors.toMap(
post -> post.getId(),
post -> post.getComments().size()
));
}
// 최신 게시물 3개를 추출하여 리스트로 반환하는 메소드
@Override
public List<Post> getLatestPosts(List<Post> posts) {
return posts
.stream()
// .sorted((p1, p2) -> p2.getCreatedAt().compareTo(p1.getCreatedAt()))
.sorted(Comparator.comparing(Post::getCreatedAt).reversed())
.limit(3) // 페이지 검색 조회 수 제한
.collect(Collectors.toList());
}
// 게시물 번호 중 가장 높은 게시물 번호를 반환하는 메소드
@Override
public int getHighestPostId(List<Post> posts) {
Optional<Post> optMaxPost = posts
.stream()
.max(Comparator.comparing(Post::getId));
Post p = optMaxPost.orElse(null);
return p == null ? 0 : p.getId();
}
// 게시물 입력 받기 메소드
@Override
public void insertPost(List<Post> pList) {
System.out.println("게시물 작성");
Scanner sc = new Scanner(System.in);
System.out.println("제목 입력 : ");
String title = sc.nextLine();
System.out.println("내용 입력 : ");
String content = sc.nextLine();
System.out.println("이름 입력 : ");
String author = sc.nextLine();
pList.add(new Post(getHighestPostId(pList) + 1, title, content,
author, LocalDateTime.now(), new ArrayList<Comment>()));
sc.close();
}
}
Java
복사