스트림
스트림은 리스트나 컬렉션에 대해 자료들을 정렬하거나 조건에 맞게 출력하는 여러가지 기능들을 미리 구현되어 있어 이를 쉽게 사용하기 위한 기능이다.
스트림 구현은 람다식을 사용한다.
스트림에는 "중간연산" 과 "최종연산" 이 있다.
중간연산: fillter, map
최종연산: forEach, count, sum, reduce
스트림으로 정수 배열의 갯수와 합계를 출력
package stream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
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(); // 카운트
System.out.println(sumVal);
System.out.println(count);
}
}
- 반복문으로 하면 길어지는 코딩들이 stream 을 사용하면 간단하게 구현할 수 있다.
컬렉션 리스트를 스트림으로 구현
package stream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class IntArrayTest {
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();
System.out.print("----------- 스트립 sorted 메서드 사용 ---------------");
System.out.println();
Stream<String> stream2 = sList.stream();
stream2.sorted().forEach(s -> System.out.print(s + " "));
}
}
reduce
미리 정해져 있는 스트림 기능 이외에 프로그래머가 직접 정의해서 사용할 수 있는 메서드
반드시 BinaryOperator 함수형 인터페이스를 구현해야한다.
package stream;
import java.util.Arrays;
import java.util.function.BinaryOperator;
class CompareString implements BinaryOperator<String> {
@Override
public String apply(String s1, String s2) {
if(s1.getBytes().length >= s2.getBytes().length) return s1;
else return s2;
}
}
public class ReduceTest {
public static void main(String[] args) {
String[] greetings = {"안녕하세요~~~~", "hello", "Good morning", "반갑습니다^^"};
System.out.println(Arrays.stream(greetings).reduce("", (s1, s2) -> {if(s1.getBytes().length >= s2.getBytes().length) return s1; else return s2;}));
String str = Arrays.stream(greetings).reduce(new CompareString()).get();
System.out.println(str);
}
}
- reduce 를 사용해 직접 구현하는 방식과 BinaryOperator 인터페이스를 직접 구현한 방식 두가지가 있다.
스트림 메서드 기능을 활용하여, 여행객 정보 구하기.
TravleCustomer
package stream;
public class TravleCustomer {
private String name;
private int age;
private int price;
public TravleCustomer(String name, int age, int price) {
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 "TravleCustomer [name=" + name + ", age=" + age + ", price=" + price + "]";
}
}
TravelTest
package stream;
import java.util.ArrayList;
import java.util.List;
public class TravelTest {
public static void main(String[] args) {
TravleCustomer customerLee = new TravleCustomer("이순신", 40, 100);
TravleCustomer customerKim = new TravleCustomer("김유신", 20, 100);
TravleCustomer customerHong = new TravleCustomer("이순신", 13, 50);
List<TravleCustomer> customerList = new ArrayList<TravleCustomer>();
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));
}
}
- 스트림을 사용하면 자료들이 정렬되어있지 않더라도 정렬을 할 수 있으며 특정 조건에 맞는 자료들만 추출할 수 있다.
- DB 쿼리와 비슷한 모습을 보인다.
- 아주 유용한 기능임에 틀림없다.
출처: do it 자바프로그래밍.