출처 : 열혈 java 프로그래밍
int[] arr = {1,2,3,4,5};
int sum = Arrays.stream(arr) //스트림 생성
.filter(n -> n%2==1) // filter 통과
.sum(); // sum 통과, 결과 반환
System.out.println(sum);
Arrays 클래스의 메소드
public static <T> Stream<T> stream(T[] array)
import java.util.*;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args){
String[] arr = {"김","나","박","이"};
Stream<String> s = Arrays.stream(arr);
s.forEach(singer->System.out.println(singer));
}
}
Arrays.stream(배열명)
으로 스트림을 생성할 수 있음import java.util.*;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
String[] arr = {"김", "나", "박", "이"};
Arrays.stream(arr)
.forEach(singer -> System.out.println(singer));
}
}
import java.util.*;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
List<String> list = Arrays.asList("김","나","박","이");
list.stream()
.forEach(singer->System.out.println(singer));
}
}
stream()
메소드를 호출해주면 됨Stream.of(11,22,33,44)
Stream.of("a","b","c")
와 같이 스트림을 직접 생성할 수 있다
스트림은 Stream<T>
인터페이스이므로 기본 타입이 올 수가 없어서 DoubleStream
IntStream
LongStream
이 정의되어 있다.
Instream.of(1,2,3)
으로 Stream<Integer>
가 아닌 int 형 스트림 IntStream
을 생성할 수 있다.
IntStream
의 경우 IntStream.range(5,8)
로 5,6,7 에 해당하는 스트림을 만들 수 있다.
두 개의 스트림을 concat
으로 연결할 수 있다.
Stream.concat(s1,s2)
필터링은 스트림을 구성하는 데이터 중 일부를 조건에 따라 걸러내는 것이다.
Stream<T> filter(Predicate<? super T> predicate)
매개변수가 Predicate 형이다. 따라서 Predicate의 boolean test(T t)
를 구현하는 람다식을 인자로 전달해야 한다.
filter는 스트림 데이터를 하나씩 인자로 전달하면서 test를 호출한다.
true를 반환하면 해당 데이터를 스트림에 남긴다. false를 반환하면 해당 데이터를 스트림에서 버린다.
import java.util.*;
public class Main {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,4,5));
list.stream()
.filter(a->a%2==0)
.forEach(a->System.out.println(a));
}
}
맵핑도 필터링과 마찬가지로 중간 연산이다.
맵핑은 스트림의 데이터 형이 달라진다는 특징이 있다.
import java.util.*;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>(Arrays.asList("love","dream","car"));
list.stream()
.map(a->a.length()) // 매핑
.forEach(a->System.out.println(a));
}
}
전달하는 람다식에 의해 반환되는 값을 모아 새로운 스트림을 생성한다.
필터링 후 맵핑을 진행하는 등 중간 연산을 두번 이상 진행할 수 있다.
import java.util.*;
public class Main {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9,10};
int sum = Arrays.stream(arr)
.filter(i->i%2==0)
.mapToObj(i->String.valueOf(i))
.mapToInt(s->s.length())
.sum();
System.out.println(sum);
}
}
mapToInt
mapToLong
mapToDouble
Stream<T> sorted(Comparator<? super T> comparator)
Stream<T> sorted()
정렬 기준 메소드를 정하는 방법은 동일하다
import java.util.*;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,4,5));
list.stream()
.sorted((a,b)->b-a)
.forEach(i->System.out.println(i));
}
}
foreach
는 스트림을 이루는 모든 데이터를 대상으로 특정 연산을 진행한다. 하지만 이것은 최종연산이다. 중간연산에서는 peek
를 사용하면 된다.
참고하면 좋은 링크
sum
count
average
min
max
forEach
allMatch(Predicate<? super T> predicate
anyMatch(Predicate<? super T> predicate
noneMatch(Predicate<? super T> predicate
findAny
findFirst
import java.util.*;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,4,5));
Optional<Integer> any = list.stream()
.sorted((a, b) -> b - a)
.findAny();
System.out.println("any.get() = " + any.get());
}
}