본문 바로가기

Backend/Java

Java Stream 기초 설명 (코딩 테스트 예제로)

최근에 어떤 기업의 경력직 코딩테스트를 보면서 Stream 기초 문제가 나왔어요.

예전에는 자바 디자인 패턴을 강조하는데,

요새는 Optional이나 Stream을 얼마나 잘 활용할 수 있냐를 보는 것 같아요.

 

문제를 약간 수정해서 공유해드리자면 이런 식이였어요.

String[] array = { "carrot", "apple", "banana", "egg", "meat", "apple" };

- 다음 배열 요소의 중복을 제거하고, 다섯 글자 이상의 단어만, 내림차순으로 정렬하여 출력하라.

- 다음 배열 요소에서 사전 상에 가장 앞에 나오는 단어 하나를 출력하라.

Stream을 이용할 것

 

그전에 Stream의 기초 사용법을 알아볼게요.

Stream 생성

String[] array = { "carrot", "apple", "banana", "egg", "meat", "apple" };
Stream<String> stream = Arrays.stream(array); // Array to Stream

List<String> list = Arrays.asList("carrot", "apple", "banana", "egg", "meat", "apple");
Stream<String> stream = list.stream(); // List to Stream

 

역으로 변환

 

String[] array = stream.toArray(String[]::new); // Stream to Array

List<String> list = stream.collect(Collectors.toList()); // Stream to List

중복 제거

stream.distinct();

정렬

stream.sorted(); // 오름차순

 

stream.sorted(Comparator.reverseOrder()); // 내림차순

필터

stream.filter((str) -> str.length() > 4); // 글자수 4이하 제거

최대값/최소값

stream.sorted().findFirst(); // 최소값 (Optional 반환)
    
stream.sorted(Comparator.reverseOrder()).findFirst(); // 최대값 (Optional 반환)

 

stream.max(Comparator.naturalOrder()); // 최대값 (Optional 반환)
stream.min(Comparator.reverseOrder()); // 최대값 (Optional 반환)

stream.max(Comparator.reverseOrder()); // 최소값 (Optional 반환)
stream.min(Comparator.naturalOrder()); // 최소값 (Optional 반환)

반복문

stream.forEach((str) -> {
	// TODO
});

 


 

이 정도만 알아도 기초적인건 다 풀 수 있을 것 같아요.

다시 문제로 돌아가서 답을 작성해보겠습니다.

 

1. 배열 요소의 중복을 제거하고, 다섯 글자 이상의 단어만, 내림차순으로 정렬하여 출력

 

Arrays.stream(array)
	.distinct()
	.filter((str) -> str.length() > 4)
	.sorted(Comparator.reverseOrder())
	.forEach(System.out::println); // 콘솔 상에 Stream 출력

 

 

2. 배열 요소에서 사전 상에 가장 앞에 나오는 단어 하나를 출력

 

Arrays.stream(array)
	.sorted()
	.findFirst()
	.ifPresent(System.out::println); // 콘솔 상에 Optional 출력

 

 

꼭 대놓고 Stream 문제가 아니더라도

배열과 리스트로 장난치는 문제들이 워낙 많아서 Stream을 알아두면 손쉽게 푸는 문제들이 꽤 많아요.

 

stream 객체에서 사용할 수 있는 메서드는 이 정도가 있네요.