반응형
이 포스팅에서 작성하는 내용은 더 자바, Java 8 에서 발췌하였습니다.
https://www.inflearn.com/course/the-java-java8
스트림(stream)
- 자바 8에서 추가된 컬렉션을 다루는 기술
- stream의 원본 데이터 컬렉션은 변경되지 않음
- 병렬 처리가 간단
- stream 내부 데이터가 무제한일 수 있음 (short circuit : 갯수 제한)
- Operation
- 중개 오퍼레이션 : Stream을 리턴, 그 뒤에 다른 중개 오퍼레이션이나 종료 오퍼레이션을 이을 수 있음.
중개 오퍼레이션은 lazy함. (종료 오퍼레이션이 나와야 중개 오퍼레이션이 작동. 종료 오퍼레이션이 없으면 정의만 한것임)
ex) filter, map, skip, limite, sorted - 종료 오퍼레이션 : Stream이 아닌, 정해진 타입으로 리턴
ex) count, forEach, min, max, collect
- 중개 오퍼레이션 : Stream을 리턴, 그 뒤에 다른 중개 오퍼레이션이나 종료 오퍼레이션을 이을 수 있음.
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Example5 {
public static void main(String[] args) {
List<String> animals = new ArrayList<>();
animals.add("dog");
animals.add("cat");
animals.add("lion");
animals.add("tiger");
// 1. 원본 컬렉션인 animals에는 변경 X
System.out.println("=====1=====");
Stream<String> upperAnimalStream = animals.stream().map(String::toUpperCase);
animals.forEach(System.out::println);
// 2. 중개 Operation은 종료 Operation이 있어야 작동한다.
System.out.println("=====2=====");
// 종료 Operation이 없어서 작동은 안하고 정의만 내림
animals.stream().map(s-> {
System.out.println(s);
return s.toUpperCase();
});
System.out.println("--------");
// 종료 Operation이 있어서 작동
List<String> upperCase = animals.stream().map(s -> {
String upper = s.toUpperCase();
System.out.println(upper);
return upper;
}).collect(Collectors.toList());
}
}
자주 사용되는 steam api
자세한 포스팅 : https://ajdahrdl.tistory.com/447
Person.java
public class Person {
private int id;
private String name;
private boolean isAdult;
public Person(int id, String name, boolean isAdult) {
this.id = id;
this.name = name;
this.isAdult = isAdult;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public boolean isAdult() {
return isAdult;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", isAdult=" + isAdult +
'}';
}
}
Example6.java
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Example6 {
public static void main(String[] args) {
List<Person> list1 = new ArrayList<>();
list1.add(new Person(1, "Gabriel", true));
list1.add(new Person(2, "Abbey", false));
list1.add(new Person(3, "Daisy", true));
list1.add(new Person(4, "Fabiola", false));
list1.add(new Person(5, "Jack", true));
list1.add(new Person(6, "Macy", false));
list1.add(new Person(7, "Olivia", true));
List<Person> list2 = new ArrayList<>();
list2.add(new Person(8, "Rachael", true));
list2.add(new Person(9, "Sally", false));
list2.add(new Person(10, "Wayne", true));
List<List<Person>> allList = new ArrayList<>();
allList.add(list1);
allList.add(list2);
// filter를 이용
System.out.println("== list1에서 name 이 A로 시작하는 리스트 ==");
list1.stream().filter(p->p.getName().startsWith("A")).forEach(System.out::println);
System.out.println("== list1에서 isAdult가 false인 Person의 id만 출력 ==");
// Predicate.not() : Predicate 구문에서 !와 같은 역할
list1.stream().filter(Predicate.not(Person::isAdult)).forEach(p-> System.out.println(p.getId()));
System.out.println("== list1에서 모든 name 출력 ==");
// map 이용
list1.stream().map(p->p.getName()).forEach(System.out::println);
System.out.println("== allList에서 모든 name 출력 ==");
// flatMap : List안에 있는 List를 제거하고 안에 있는 알맹이만 취급할 수 있도록 도와주는 역할
allList.stream().flatMap(list -> list.stream()).forEach(p-> System.out.println(p.getName()));
System.out.println("== allList에서 이름에 s가 들어가는 학생이 있는지 확인 ==");
boolean isExist = allList.stream().flatMap(list -> list.stream()).anyMatch(p -> p.getName().contains("s"));
System.out.println(isExist);
System.out.println("== allList에서 성인만 추출해서 리스트 만들기 ==");
List<Person> collect = allList.stream().flatMap(list -> list.stream()).filter(p -> p.isAdult()).collect(Collectors.toList());
collect.forEach(System.out::println);
System.out.println("== 5부터 1씩 증가하는 무한 stream에서 앞에 5개 빼고, 5개까지만 보여주기 ==");
Stream.iterate(5, num->num+1)
.skip(5)
.limit(5)
.forEach(System.out::println);
}
}
반응형
'BE > Java' 카테고리의 다른 글
[Java 8] Date / Time (0) | 2023.04.21 |
---|---|
[Java 8] Optional (0) | 2023.04.15 |
[Java 8] Default Method, Java 8의 NEW 기본 메서드 (0) | 2023.04.13 |
[Java 8] 람다 표현식과 메서드 레퍼런스 (0) | 2023.04.12 |
[Java 8] Java 8과 함수형 인터페이스 (0) | 2023.04.11 |