스트림이란 자바 8부터 새로 추가된 기능이며 컬렉션, 배열 등에 저장된 요소를 하나씩 참조하면서 코드를 실행할 수 있는 기능이다
재사용 불가기존 자료를 변경하지 않음 (read only)중간 연산과 최종 연산으로 구분 됨연산 결과가 스트림) -> 최종 연산(스트림 요소 소모) -> 결과 리턴IntStream, LongStream, DoubleStream 등을 제공여러 개의 연산이 적용될 수 있다
Stream<T> filter(Predicate < ? super T> predicate);
// boolean 값을 리턴하는 람다식을 넘겨주고,
// 뽑아져 나오는 데이터에 대해 람다식을 적용하여 true가 리턴되는 데이터만 선별
<R> Stream<R> map(Function < ? super T, ? extends R> mapper);
// 값을 변환해주는 람다식을 인자로 받음
// 스트림에서 생성된 데이터에 map() 메소드의 인자로 받은 람다식을 적용해 새로운 데이터를 만듬
Stream<T> sorted();
// 인자 없이 호출 시 오름차순으로 정렬
Stream<T> sorted(Comparator < ? super T > comparator);
// 만약 정렬할 때 두 값을 비교하는 별도의 로직이 있다면,
// comparator를 sorted() 메소드의 인자로 넘겨줄 수도 있음
Stream<T> peek(Consumer < ? super T > action);
// 그냥 한 번 해본다는 의미로 생성되는 데이터들에 변형을 가하지 않고 그냥 인자로 받은 람다식만 수행
int sum = IntStram.range(1, 10).peek(System.out::println).sum();
// 위와 같이 중간에 확인하고자 할 때 사용하면 좋음
마지막 한 번만 적용됨
void forEach(Consumer<? super T> action)
void forEachOrdered(Consumer<? super T> action)
long count()
Optional<T> max(Comparator<? super T> comparator)
Optional<T> min(Comparator<? super T> comparator)
Optional<T> findAny()
Optional<T> findFirst()
boolean allMatch(predicate<T> P)
boolean anyMatch(Predicate<T> P)
boolean noneMatch(Predicate<T> P)
Object[] toArray()
최종 연산이 호출되어야 중간 연산에 대한 수행이 이루어지고 그 결과가 만들어진다.
중간 연산에 대한 결과를 연산 중간에 알 수 없으며, 이를지연 연산이라 한다.
Stream.of("a", "b", "c");
Stream.of(new String[]{"a", "b", "c"});
Arrays.stream(new String[]{"a", "b", "c"});
Arrays.stream(new String[]{"a", "b", "c"}, startIndex, EndIndex + 1);
// Stream.iterate(T send, UnaryOperator f); 이전 결과에 종속적
Stream.iterate(0, n -> n + 2); // 0, 2, 4, ... 무한 스트림
// generate는 초기값 지정 x, 이전 결과와 무관, 중간 연산
Stream.generate(Math::random);
Stream.generate(()->1);
sList.stream().filter(s->s.length() >= 5).forEach(s->System.out.println(s));
// filter()로 문자열 중 길이가 5 이상인 요소 추출 -> forEach()로 추출된 문자열 각각에 대해 sout 실행 -> stream에는 자료가 남아있지 않음
// filter 람다식의 리턴값은 true, false로 false면 버려짐
customerList.stream().map(c->c.getName()).forEach(s->System.out.println(s));
// map()로 customer 객체를 customer객체의 getName()함수로 문자열을 변환 -> forEach()로 변환된 문자열 각각에 대해 sout 실행 -> stream에는 자료가 남아있지 않음
// map(file::getName) -> 각각의 파일에서 String Name만 새로운 스트림으로
// map(s->s.subString(3)) string 타입 요소를 짤라서 새로운 스트림으로
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.print(s+ " "));
// 문자열 sorted()로 정렬 -> forEach()로 정렬된 문자열 각각에 대해 sout 실행
sList.stream().map(s->s.length()).forEach(n->System.out.println(n));
// map()로 문자열을 길이로 변환 -> forEach()로 변환된 숫자 각각에 대해 sout 실행
// 기존 stream은 재사용할 수 없으므로, stream() 메소드 호출하여 스트림 다시 생성
}
}
public class IntArrayStreamTest {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
Arrays.stream(arr).forEach(n->System.out.print(n + "\t"));
// forEach()로 arr에 입력된 숫자 각각에 대해 sout+tab 실행
System.out.println();
int sum = Arrays.stream(arr).sum();
System.out.println("sum: " + sum);
// sum()로 배열 합 구하기
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
int sum2 = list.stream().mapToInt(n->n.intValue()).sum();
System.out.println(sum2);
// mapToInt()로 Integer wrapper 객체 형에서 int data type으로 변경 -> sum()로 배열 합 구하기
}
}
T reduce(T identify, BinaryOperator<T> accumulator)
Optional<T> reduce(BinaryOperator<T> accumulator);
Arrays.stream(arr).reduce(0, (a,b)->a+b));
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();
//BinaryOperator를 구현한 클래스 이용
System.out.println(str);
}
}