위로
아래
필터링
- 중간 연산
- 입력된 원소 중에서 일부 원소를 걸러낸다
- 메소드 종류
- filter(람다식) : 람다식 조건에 맞는 원소만 다음 스트림으로
- distinct() : 중복된 원소를 제거
- limit(숫자) : 주어진 개수만큼의 원소만 다음 스트림으로
- skip(숫자) : 주어진 개수만큼 스트림 원소를 건너 뛴다
예시
더보기
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class FilterDemo {
public static void main(String[] args) {
// 스트림 분리형
System.out.println("문자열 스트림 : ");
Stream<String> s1 = Stream.of("a1","b1","b2","c1","c2","c3");
Stream<String> s2 = s1.filter(x->x.startsWith("c"));
Stream<String> s3 = s2.skip(1);
s3.forEach(Util::print);
//스트림 파이프라인
System.out.println("\n정수 스트림 : ");
IntStream i1 = IntStream.of(1,2,1,3,3,2,4);
i1.filter(x -> x%2 ==0).
distinct().
forEach(Util::print);
}
}
매핑
- 입력 스트림을 다른 종류의 스트림으로 변경
- 메소드
- map(람다식) : 주어진 람다식을 이용하여 입력 스트림의 객체를 다른 타입으로 매핑한다
- flatMap() : 그룹 원소를 낱개 원소로 펼치는 평면화 작업 수행 (문장을 단어로 분리)
- mapToObj() : 숫자 스트림을 객체 스트림으로 매핑
- mapToInt() : 다른 타입의 스트림을 IntStream으로 매핑
- asLongStream() : IntStream을 LongStream으로 매핑
- asDoubleStream() : IntStream을 DoubleStream으로 매핑
예시
더보기
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class Map1Demo {
public static void main(String[] args) {
Stream<String> s1 = Stream.of("a1","b1","b2","c1","c2");
Stream<String> s2 = s1.map(String::toUpperCase);
s2.forEach(Util::print);
System.out.println();
Stream<Integer> i1 = Stream.of(1,2,1,3,3,2,4);
i1.map(x -> x * 2).
forEach(Util::print);
System.out.println();
Stream<String> s3 = Stream.of("a1","a2","a3");
Stream<String> s4 = s3.map(a -> a.substring(1));
IntStream i3 = s4.mapToInt(Integer::parseInt);
Stream<String> s5 = i3.mapToObj(i -> "b" + i);
s5.forEach(Util::print);
}
}
예시2
더보기
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class Map3Demo {
public static void main(String[] args) {
List<String> list1 = List.of("안녕, 자바!", "잘 가, C++!");
Stream<String> s1 = list1.stream();
Stream<String> s2 = s1.flatMap(s -> Arrays.stream(s.split(" ")));
s2.forEach(Util::printWithParenthesis);
System.out.println();
List<String> list2 = List.of("좋은 아침");
List<String> list3 = List.of("안녕! 람다", "환영! 스트림");
Stream<List<String>> s3 = Stream.of(list1, list2, list3);
Stream<String> s4 = s3.flatMap(list ->{
if(list.size()>1)
return list.stream();
else
return Stream.empty();
});
s4.forEach(Util::printWithParenthesis);;
}
}
정렬
- 입력된 스트림 원소 전체를 정렬
- 중간 연산
- 버퍼가 필요하다
- 숫자 스트림과 문자열 스트림에 정렬 연산을 수행하려면 sorted() 연산 사용
- 메소드
- sorted()
- sorted(Comparator.comparing())
예시
더보기
import java.util.Comparator;
import java.util.stream.Stream;
public class SortedDemo {
public static void main(String[] args) {
Stream<String> s1 = Stream.of("d2","a2","b1","b3","c");
Stream<String> s2 = s1.sorted();
s2.forEach(Util::print);
System.out.println("국가 이름 순서");
Stream<Nation> n1 = Nation.nations.stream();
Stream<Nation> n2 = n1.sorted(Comparator.comparing(Nation::getName));
Stream<String> s3 = n2.map(x -> x.getName());
s3.forEach(Util::printWithParenthesis);
System.out.println("국가 GDP 순서");
Stream<Nation> n3 = Nation.nations.stream();
Stream<Nation> n4 = n3.sorted(Comparator.comparing(Nation::getGdpRank));
Stream<String> s4 = n4.map(Nation::getName);
s4.forEach(Util::printWithParenthesis);
}
}
매칭과 검색
- 특정 속성과 일치되는 스트림 원소의 존재 여부를 조사하거나 검색하는데 사용
- 최종 연산
- 메소드
- anyMatch(람다식) : 람다식 조건에 맞는 것이 있는지(or) 조사해서 true, false 반환
- allMatch(람다식) : 람다식 조건에 모두 맞는지(and) 조사해서 true, false 반환
- noneMatch(람다식) : 람다식 조건에 안 맞는 게 있는지 조사해서 true, false 반환
- findAny() : 앞에서 넘겨준 조건 중에 첫 번째로 조건에 맞는 요소 찾기
- findFirst() :
예시
더보기
import java.util.Optional;
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class MatchDemo {
public static void main(String[]args) {
boolean b1 = Stream.of("a1","b2","c3").anyMatch(s->s.startsWith("c"));
System.out.println(b1);
boolean b2 = IntStream.of(10,20,30).allMatch(p -> p % 3 ==0);
System.out.println(b2);
boolean b3 = IntStream.of(1,2,3).noneMatch(p -> p == 3);
System.out.println(b3);
if(Nation.nations.stream().allMatch(d -> d.getPopulation() > 100.0))
System.out.println("모든 국가의 인구각 1억이 넘는다.");
else
System.out.println("모든 국가의 인구가 1억이 넘지 않는다.");
Optional<Nation> nation = Nation.nations.stream().findFirst();
nation.ifPresentOrElse(Util::print, () -> System.out.print("없음."));
System.out.println();
nation = Nation.nations.stream().filter(Nation::isIsland).findAny();
nation.ifPresent(Util::print);
}
}
루핑과 단순 집계
루핑 (looping)
- 전체 원소를 반복하는 연산
- 메소드
- forEach() : 최종 연산.
- peek() : 중간 연산.
단순 집계 (reduction)
- 스트림을 사용하여 스트림의 원소 개수, 합계, 평균값, 최댓값, 최솟값 등과 같은 값을 도출
- count(), sum(), average(), max(), min()
- max()와 min()은 매개 값이 필요하다면 Comparator타입을 이용
- count()와 sum()을 제외하고는 옵션 타입을 반환
예시
더보기
import java.util.*;
import java.util.stream.*;
public class LoopAggregateDemo {
public static void main(String[] args) {
Stream<Nation> sn = Nation.nations.stream().peek(Util::printWithParenthesis);
//peek은 중간 연산자라서 바로 연산 안 되고 기다린다.
System.out.println("어디 나타날까?");
//peek이 최종연산자인 max를 만나면서 출력을 하고, comparing을 실행해서 결과를 Optional에 담는다
Optional<Nation> on = sn.max(Comparator.comparing(Nation::getPopulation));
System.out.println();
System.out.println(on.get());
//인구 수가 가장 많은 나라 출력하는데 Optional 객체를 출력
System.out.println(IntStream.of(5,1,2,3).min().getAsInt());
sn = Nation.nations.stream();
System.out.println(sn.count());
}
}