- 스트림 예시
// 스트림 생성
int[] arr = {1, 2, 3, 4, 5};
Arrays.stream(arr).forEach(n -> System.out.println(n));
- 스트림 연산
중간 연산 - filter(), map()
filter()는 조건을 넣고 그 조건에 맞는 참인 경우만 추출하는 경우에 사용
sList.stream().filter(s->s.length() >= 5).forEach(s-> System.out.println(s));
map()은 특정조건에 해당하는 값으로 변환 시 사용 ex) 클래스가 가진 자료 중 이름만 출력하는 경우에 사용
customerList.stream().map(c-> c.getName()).forEach(s-> System.out.println(s));
최종연산 - forEach(), count(), sum(), reduce()
최종연산은 스트림의 자료를 소모하면서 연산을 수행하기 때문에 최종 연산이 수행되고 나면 해당 스트림은 더이상 사용할 수 없음. 최종 연산은 결과를 만들 때 주로 사용
forEach()는 요소를 하나씩 꺼내는 기능
sum(), count()는 배열 요소 합계를 구한다든가 개수를 출력하는 등의 연산을 수행
- 스트림 생성과 사용
1. 정수 배열에 스트림 생성하고 사용하기
package first_project;
import java.util.Arrays;
public class IntArrayTest {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
int sumVal = Arrays.stream(arr).sum();
int count = (int) Arrays.stream(arr).count(); //count() 반환 값이 long이므로 int형으로 변환
System.out.println(sumVal);
System.out.println(count);
}
}
결과
15
5
2. Collection에서 스트림 생성하고 사용하기
Collection에서 stream() 메서드를 사용하면 이 클래스는 제네릭형을 사용해 다음과 같이 자료형을 명시할 수 있음
Stream<String> stream = sList.stream();
package first_project;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class ArrayListStreamTest {
public static void main(String[] args) {
List<String> sList = new ArrayList<String>();
sList.add("Tomas");
sList.add("Edward");
sList.add("Jack");
Stream<String> stream = sList.stream(); // 스트림 생성
stream.forEach(s->System.out.print(s + " ")); // 배열의 요소를 하나씩 출력
System.out.println();
sList.stream().sorted().forEach(s->System.out.println(s)); // 스트림 새로 생성, 정렬, 요소를 하나씩 꺼내서 출력
}
}
결과
Tomas Edward Jack
Edward
Jack
Tomas
- 스트림의 특징
1. 자료의 대상과 관계없이 동일한 연산 수행
2. 한 번 생성하고 사용한 스트림은 재사용할 수 없음: 어떤 자료에 대한 스트림을 생성하고 이 스트림에 메서드를 호출하여 연산을 수행했다면 해당 스트림을 다시 다른 연산에 사용할 수 없음
3. 스트림의 연산은 기존 자료를 변경하지 않음: 스트림을 생성하여 정렬한다거나 합을 구하는 등의 여러 연산을 수행한다고 해서 기존 배열이나 컬렉션이 변경되지는 않음
4. 스트림의 연산은 중간 연산과 최종 연산이 있음: 스트림에 중간 연산은 여러 개가 적용될 수 있고, 최종 연산은 맨 마지막에 한번 적용됨. 만약 중간 연산이 여러개 호출되었더라도 최종 연산이 호출되어야 스트림의 중간 연산이 모두 적용됨
- reduce() 연산 : 프로그래머가 직접 기능을 지정
package first_project;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class ArrayListStreamTest {
public static void main(String[] args) {
String[] greetings = {"안녕하세요", "hello", "good morning", "반갑습니다^^", "하이"};
String answer = new String();
answer = Arrays.stream(greetings).reduce("..",(s1, s2) ->{
System.out.print("s1: "+s1);
System.out.println(" s2: "+s2);
if(s1.getBytes().length >= s2.getBytes().length)
return s1;
else return s2;});
System.out.println(answer);
}
}
결과
s1: .. s2: 안녕하세요
s1: 안녕하세요 s2: hello
s1: 안녕하세요 s2: good morning
s1: good morning s2: 반갑습니다^^
s1: good morning s2: 하이
good morning
- 스트림의 활용
package first_project;
public class TravelCustomer {
private String name;
private int age;
private int price;
public TravelCustomer(String name, int age, int price) {
super();
this.name = name;
this.age = age;
this.price = price;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public int getPrice() {
return price;
}
@Override
public String toString() {
return "TravelCustomer [name=" + name + ", age=" + age + ", price=" + price + "]";
}
}
package first_project;
import java.util.ArrayList;
import java.util.List;
public class TravelTest {
public static void main(String[] args) {
TravelCustomer customerLee = new TravelCustomer("이순신", 40, 100);
TravelCustomer customerKim = new TravelCustomer("김유신", 20, 100);
TravelCustomer customerHong = new TravelCustomer("홍길동", 13, 50);
List<TravelCustomer> customerList = new ArrayList<>();
customerList.add(customerLee);
customerList.add(customerKim);
customerList.add(customerHong);
System.out.println("== 고격 명단 추가된 순서대로 출력==");
customerList.stream().map(c->c.getName()).forEach(s->System.out.println(s));
int total = customerList.stream().mapToInt(c->c.getPrice()).sum();
System.out.println("총 여행 비용: "+ total);
System.out.println("==20세 이상 고객 명단을 정렬하여 출력");
customerList.stream().filter(c->c.getAge()>=20).map(c->c.getName()).sorted().forEach(s->System.out.println(s));
}
}
결과
== 고격 명단 추가된 순서대로 출력==
이순신
김유신
홍길동
총 여행 비용: 250
==20세 이상 고객 명단을 정렬하여 출력
김유신
이순신
댓글