컬렉션, 배열 등의 저장 요소를 하나씩 참조하여 함수형 인터페이스(람다식)를 적용하며 반복적으로 처리할 수 있도록 해주는 기능.
java8에서 부터 람다식으로 stream 인터페이스를 사용할 수 있다.
stream API에는 findAny(), findFirst()등의 메소드가 존재한다.
findFirst() 메소드는 말그대로 첫 번째 요소를 반환하는 스트림이다.
Stream API 특징
출처: https://mangkyu.tistory.com/112 [MangKyu's Diary]
위와 같이 stream 인터페이스를 이용하여 원하는 값을 찾을 수 있다.
List<String> engChange = new ArrayList<String>();
engChange.add("AAA");
engChange.add("BBB");
engChange.add("CCC");
System.out.println(engChange);
//java7 기존식
for(String s : engChange) {
System.out.println(s.toLowerCase());
}
//java8 람다식
engChange.stream().map(s -> s.toLowerCase())
.forEach(s -> System.out.println(s));
public int getTotalPrice() {
/*
int totalPrice = 0;
for (OrderItem orderItem : orderItems) {
totalPrice += orderItem.getTotalPrice();
}
return totalPrice;
*/
// 윗 부분을 아래와 같이 변경 가능
return orderItems.stream().mapToInt(OrderItem::getTotalPrice).sum();
}
// 일반 리스트
public void testList1() {
List<String> list1 = Arrays.asList("김김","님님","딤딤","림림");
List<String> list2 = Arrays.asList("금금","늠늠","딤딤","림림");
// 중복되지 않은 값 추출
List<String> notMatchResult = list1.stream()
.filter(origin -> list2.stream().noneMatch(Predicate.isEquals(origin))
.collect(Collectors.toList());
System.out.println(notMatchResult); //["김김","님님","림림"]
// 중복되는 값 추출
List<String> matchResult = list1.stream()
.filter(origin -> list2.stream().anyMatch(Predicate.isEquals(origin))
.collect(Collectors.toList());
System.out.println(matchResult); //["딤딤"]
}
// 객체 리스트
public void testList2() {
List<String> list1 = Arrays.asList(new User(1,"김김"),new User(2,"님님"),new User(3,"딤딤"));
List<String> list2 = Arrays.asList(new User(10,"금금"),new User(2,"님님"),new User(3,"딤딤"));
// 중복되지 않은 값 추출
List<String> notMatchResult = list1.stream()
.filter(origin -> list2.stream().noneMatch(target -> origin.getId().equals(target.getId())))
.collect(Collectors.toList());
System.out.println(notMatchResult); //User[id=1, name=김김]
// 중복되는 값 추출
List<String> matchResult = list1.stream()
.filter(origin -> list2.stream().anyMatch(target -> origin.getId().equals(target.getId())))
.collect(Collectors.toList());
System.out.println(matchResult); //[User[id=2, name=님님],User[id=3, name=딤딤]]
}
- for문은 단순 인덱스 기반이라 메모리 접근이기 때문에 빠르고 오버헤드가 없다.
- stream의 경우, JVM이 여러가지를 처리해줘야 해서 실행이 느리다.
- for문은 컴파일러가 최적화를 시킨다.
즉, 단순 forEach일 경우, stream이 아닌 for문을 사용하는게 좋다.
참고 링크
정규식 테스트 링크 (0) | 2021.04.16 |
---|---|
Optional(java8에서 추가된 null처리) (0) | 2021.04.11 |
로직 실행 시간 측정 (0) | 2021.04.10 |
Collections.sort() (0) | 2021.04.02 |
spring와 spring boot 차이 (0) | 2021.03.26 |