반응형
java8 stream의 쉬운 사용방법 (map, filter, collect)
java8부터 지원 되는 대표적인 API인 stream에 대해 알아보려고 한다.
Stream은 컬렉션, 배열에 저장되어 있는 요소들을 하나씩 참조하며 반복적인 처리를 가능하게 한다.
Stream과 람다표현식을 사용하면 for문과 if문을 사용하지 않고도 깔끔하고 직관적이게 코드를 변경 할수있다.
몰라도 당연히 처리 할수 있지만, Strame이 생겨서 컬렉션 배열 계열의 처리가 간단하게 할수 있다 이런말로 요약할수 있다.
Stream 특징 몇가지만 알아보자!!
1. Stream은 원본 데이터를 읽기만 하지, 원본데이터 변경을 하지 않는다.
2. Stream은 정렬된 결과를 컬레션이나 배열에 담아 반환 할수있다. ( collect )
3. Stream은 내부 반복문이며, 반복문이 코드상에 노출 되지 않는다.
map() : 요소들을 조건에 맞게 변환할수 있다.
- 원본데이터가 변경되지 않는점을 유심히 보자
public static void main(String args[]){
List<String> list = new ArrayList<>();
list.add("apple");
list.add("ball");
list.add("car");
list.add("daddy");
list.add("ear");
list.add("fox");
// 요소들을 조건에 해당하는 값으로 변환 해준다.
// map
System.out.println("==========stream1=========");
Stream stream1 = list.stream().map(s -> s.toUpperCase()); // 반복문이 코드상에 노출X
stream1.forEach(System.out::println);
System.out.println("=========stream2==========");
Stream stream2 =list.stream().map(String::toUpperCase); // 반복문이 코드상에 노출X
stream2.forEach(System.out::println);
System.out.println("==========원본데이터=========");
// 원본 데이터는 변경되지 않는다.
// list.forEach(System.out::println);
list.forEach(s -> System.out.println(s)); // "System.out::println"와 동일 = 람다 표현식
}
<결과>
출력 결과는 아래에서 자세히 확인해 보시기 바랍니다.
==========stream1=========
APPLE
BALL
CAR
DADDY
EAR
FOX
=========stream2==========
APPLE
BALL
CAR
DADDY
EAR
FOX
==========원본데이터=========
apple
ball
car
daddy
ear
fox
filter() : 스트림내에 있는 요소에 대해 필터링 한다.
public static void main(String args[]){
List<String> list = new ArrayList<>();
list.add("apple");
list.add("ball");
list.add("car");
list.add("daddy");
list.add("ear");
list.add("fox");
// filter
// 문자 3자 이상만
Stream stream1 = list.stream().filter(s -> s.length() > 3);
stream1.forEach(System.out::println);
System.out.println("==============================");
// 문자가 a로 시작하는 것만
Stream<String> stream2 = list.stream().filter(s -> s.startsWith("a"));
stream2.forEach(System.out::println);
}
<결과>
출력된 결과에 대해 아래에서 자세히 확인해 보시기 바랍니다.
apple
ball
daddy
==============================
apple
collect() : Stream 데이터를 원하는 자료형으로 변환 해준다.
위의 예제와 같이 filter로 데이터를 추출했다고 가정하면, 컬렉션이나 배열로 변환해서 반환 할수 있다.
public static void main(String args[]){
List<String> list = new ArrayList<>(Arrays.asList("apple","ball","car","daddy","ear","fox"));
System.out.println("===============counting()===============");
Long count = list.stream().filter(s -> s.length() > 3).collect(counting());
System.out.println("count - " + count);
System.out.println("================Collectors.toList==============");
List nList = list.stream().filter(s -> s.length() > 3).collect(Collectors.toList());
System.out.println(nList);
System.out.println("================Collectors.joining==============");
// list의 아이템을 1개의 String으로 만들기 ( 구분자 "," )
String longStr = list.stream().filter(s -> s.length() > 3).collect(Collectors.joining(","));
System.out.println(longStr);
System.out.println("===============Collectors.toMap===============");
Map map = list.stream().filter(s -> s.length() > 3).collect(Collectors.toMap(s -> s, s-> s.length()));
map.forEach((a, b) -> {
System.out.println(a + " " + b);
});
System.out.println("===============toArray()===============");
Object[] obj = list.stream().filter(s -> s.length() > 3).toArray();
for (Object o : obj) {
System.out.println((String) o);
}
}
<결과>
출력된 결과에 대해 아래에서 자세히 확인해 보시기 바랍니다.
===============counting()===============
count - 3
================Collectors.toList==============
[apple, ball, daddy]
================Collectors.joining==============
apple,ball,daddy
===============Collectors.toMap===============
ball 4
apple 5
daddy 5
===============toArray()===============
apple
ball
daddy
'프로그래밍 > JAVA' 카테고리의 다른 글
sonarQube - Public constants and fields initialized at declaration should be "static final" rather than merely "final" (0) | 2022.07.22 |
---|---|
sonarQube - Field names should comply with a naming convention. (0) | 2022.07.22 |
자바 문자열을 날짜로 변환하기 (0) | 2022.05.31 |
모든 파라미터를 받아 그대로 POST submit 하는 JSP 페이지 (0) | 2022.05.31 |
JAVA REST API 호출, oauth2 연동, example code (0) | 2022.02.18 |
댓글