👩💻 BackEnd/☕️ 자바 [Java]
[Java] 자바 8 버전 이상의 자바문법 : 스트림 API
minhe2810
2024. 2. 26. 00:43
✅ ** 해당 내용은 '이것이 취업을 위한 백엔드 개발이다' 책을 보며 개인공부 목적으로 정리한 내용입니다! **
스트림 API
컬렉션에 추가된 메서드의 집합을 의미
컬렉션에 담긴 데이터를 처리하는 존재라는 것을 명심!
forEach()
: 컬렉션의 요소들을 하나씩 꺼내서 반복하므로 문법적으로 보면 반복문을 쉽게 대처할 수 있다.
public class Lambda {
public static void main(String[] args) {
List list = new ArrayList();
list.add("public");
list.add("static");
list.add("void");
// for 문으로 List 를 순회할 수 있다.
for (int i = 0; i < list.size(); i++) {
System.out.println("list = " + list.get(i)); // i번째 요소가 출력된다.
}
list.stream().forEach(str -> System.out.println("str = " + str));
}
}
filter()
: 컬렉션의 요소들 중 조건문에 맞는 요소만 뽑아 새로운 스트림을 만든다.
collect() 메서드와 함께 사용하면 전체 리스트 요소 중 조건문을 만족하는 요소를 뽑아 새로운 리스트를 만들 수 있다.
package pkg2;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Lambda2 {
public static void main(String[] args) {
Integer[] integers = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
List<Integer> list = Arrays.asList(integers);
// List evenList = new ArrayList<Integer>();
// for (int i = 0; i < list.size() ; i++) {
// Integer number = list.get(i);
// if (number % 2 == 0) {
// evenList.add(number);
// }
// }
//
// for (int i = 0; i < evenList.size(); i++) {
// System.out.println("evenList = " + evenList.get(i));
// }
List evenList = list.stream()
.filter(value-> value % 2 == 0).collect(Collectors.toList());
evenList.stream().forEach(value -> System.out.println("value = " + value));
}
}
distinct()
: 컬렉션의 요소에서 중복을 제거한다.
중복을 제거한다는 행위가 이미 정해져있기 때문에 람다 표현식을 함수의 인자로 넘겨줄 필요가 없고, 이때 중복인지 아닌지를 판단하는 것은 요소들의 equals() 메서드이다.
public class Lambda3 {
public static void main(String[] args) {
Integer[] integers = new Integer[]{1, 2, 3, 4, 5};
List<Integer> list = Arrays.asList(integers);
list.stream()
.forEach(val -> System.out.println(val));
// filter() : 컬렉션의 요소들 중 조건문에 맞는 요소만 뽑아 새로운 스트림을 만든다.
List evenList = list.stream()
.filter(val -> val % 2 ==0).collect(Collectors.toList());
evenList.stream().forEach(val -> System.out.println("even val = " + val));
System.out.println("----------------------");
// distinct() : 컬렉션의 요소에서 중복을 제거한다. 중복을 제거한다는 행위가 이미 정해져있기 때문에 람다 표현식을 함수의 인자로 넘겨줄 필요가 없고, 이때 중복인지 아닌지를 판단하는 것은 요소들의 equals() 메서드이다.
List<Integer> distinctList = list.stream().distinct().collect(Collectors.toList());
distinctList.stream().forEach(val -> System.out.println("distinct val = " + val));
}
}
map()
: 컬렉션의 요소들에 특정 연산을 적용한 새로운 스트림을 만든다. 이때 입력으로 들어간 컬렉션의 수와 출력으로 나오는 컬렉션의 수는 동일하다.
package pkg2;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Lambda4 {
public static void main(String[] args) {
String[] lowercaseArray = new String[]{"public", "static", "void"};
List<String> lowercaseList = Arrays.asList(lowercaseArray);
// map() : 컬렉션의 요소들에 특정 연산을 적용한 새로운 스트림을 만든다.
// 이때 입력으로 들어간 컬렉션의 수와 출력으로 나오는 컬렉션의 수는 동일하다.
// 예를 들어 문자열 컬렉션의 모든 소문자 요소들을 대문자로 바꾸는 새로운 컬렉션은 다음과 같이 만들 수 있다.
List<String> uppercaseList = lowercaseList.stream()
.map(val -> val.toUpperCase()).collect(Collectors.toList());
uppercaseList.stream().forEach(val-> System.out.println("val = " + val));
// collect(Collect.toList()) : 스트림을 간단하게 리스트로 만들 수 있다. 이렇게 리스트로 바꾸는 경우가 아주 많기 때문에 자바 16버전 부터는 .collect(Collect.toList()) 대신 .toList() 를 사용해 간결하게 코드를 작성하는 것이 가능해졌다.
}
}
collect() / toList()
: filter(), distinct(), map() 과 함께 .collect(Collectors.toList()) 형태로 사용하면 스트림을 간단하게 리스트로 만들 수 있다.
이렇게 리스트로 바꾸는 경우가 아주 많아서 자바 16 버전 부터는 toList() 를 사용해 간결하게 코드를 작성하는게 가능해졌다고 한다.