Array 나 Collection Framework 의 데이터를 쉽고 빠르게 처리 할 수 있다.
- 원본 데이터를 변경하지 않는다.
- 일회용이다.
- 내부 반복으로 작업을 처리 한다.
- 병렬처리가 가능하다.
일련의 가공과정을 거쳐 새로운 데이터를 만들어 낸다.
// 1.filter 는 해당 스트림 안에 조건을 만족하는 값만 따로 담아낸다.
list.stream().filter(new Predicate<String>() {
// Predicate<T> - 매개변수를 통해 Boolean 을 반환
@Override
public boolean test(String t) {
return t.contains("java");
}
// 2. map 은 stream 안의 값을 받아서 가공할때 사용 한다.
// input -> map -> 가공된 output files.stream().map(new Function<File,String>() {
@Override
public String apply(File f) {
return f.getName();
}
// 3. 중복 제거 : DB의 distinct() 와 같다.
Object[] obj = list.stream().distinct().toArray();
// 4. peek 은 데이터에 영향을 주지 않는다.
// forEach 처럼 테스트로 로그를 볼때 활용
// 차이점은 forEach 는 최종적으로, peek은 중간에 확인이 가능하다는 점이다.
IntStream.rangeClosed(1, 10).peek(new IntConsumer() {
@Override
public void accept(int value) {
System.out.println(value);
}
}).sum();
// 5. Collection 이나 Arrays 에서 사용하는 정렬과 비슷하다.
Object[] arr=list.stream().map(new Function<String, String>() {
@Override
public String apply(String t) {
return t.toUpperCase();
}
}).sorted().toArray();
// 6.mapToXXX
// 일반 스트림과 원시스트림(int,long,double 등의 원시타입을 갖는 스트림) 간의 변경
int[] result =list.stream().mapToInt(new ToIntFunction<String>() {
@Override
public int applyAsInt(String value) {
return Integer.parseInt(value);
}
}).toArray();
가공을 통해 만들어진 결과에 대해 최종 데이터를 구해 낼 수 있다.
// int -> Integer (Boxing) / Integer -> int (un Boxing)
List<Integer> intList =Arrays.stream(intArr).boxed().collect(Collectors.toList());
String join = Arrays.stream(stringArr).collect(Collectors.joining("/"));
- __GroupBy__
// Collectors.groupingBy() : Stream 에서 작업한 결과를 특정 기준으로 그룹화 해 준다.
```java
Map<String, List<Info>> group =infoList.stream().collect(Collectors.groupingBy(new Function<Info, String>() {
@Override public String apply(Info t) { return t.getCity(); } }));
System.out.println(group); for (String key : group.keySet()) { for (Info info : group.get(key)) {
System.out.println(key+" : +info.getName()+"("+info.getAge()+")"); } }
// 30대 이상인 부류와 아닌 부류
Map<Boolean, List<Info>> partition =
infoList.stream().collect(Collectors.partitioningBy(new Predicate<Info>() {
@Override public boolean test(Info t) { return t.getAge()>=30; } }));
System.out.println(partition);
for (
Boolean key:partition.keySet())
{ for (Info info : partition.get(key))
{
System.out.println("30대 이상 여부 : "+key+" "+info.getAge()+" : "+info.getName())
; } }