List<String> names = Arrays.asList("jeong","pro","jdk","java");
Stream<String> a = names.stream().filter(x -> x.contains("o"));
filter는 말 그대로 필터링, 증 조건에 맞는 것만 거른다는 것이다.
위의 코드에서는 람다식을 이용해서 x로 스트림의 요소를 받고 각 요소에 "o"라는 알파벳이 있는 것들만 거른다. 즉, jeong
과 pro
만 가지고 있는 스트림을 반환한다.
names.stream().map( x -> x.concat("s") ).forEach(System.out::println);
// mad,play,kim,hyoz -> mads,plays,kims,hyozs
map은 기존의 데이터에서 수정하여 적용한다는 의미를 가진다.
예를 들어, String형에서 "s"문자열을 끝에 추가하여 리턴한다거나 Int형에서는 값을 x2배 하여 리턴한다거나 다양한 조작이 가능하다.
String[][] namesArray = new String[][] {
{"kim", "hyoz"}, {"lee", "sooyoung"},
{"joy", "taehui"}, {"woo", "park"}
};
Arrays.stream(namesArray)
.flatMap(innerArray -> Arrays.stream(innerArray))
.filter(name -> name.length() <= 3 )
.collect(Collectors.toList())
.forEach(System.out::println);
// 결과: kim,lee,joy,woo
flatMap은 기존 2차원 이상의 배열을 조작시 쓰인다는 점에서 map과 차이가 있다.
map으로도 2차원 배열 형태의 스트림을 다룰 수 있지만 조금 더 복잡해질 뿐이다.
flatMap은 중첩 구조를 한 단계 제거하고, 단일 컬렉션으로 만들어주는 기능을 수행할 수 있다.
IntStream intStream1 = IntStream.of(7,5,5,2,1,2,3,5,4,6);
intStream1
.skip(2)
.peek(s -> System.out.println("skip(2) 실행 후:" + s))
.limit(5)
.forEach(n -> System.out.println(n));
// 2칸 건너뛰고 5,2,1,2,3 출력됨.
peek() 메소드는 결과 스트림으로부터 요소를 소모하여 추가로 명시된 동작을 수행한다.
주로 결과를 확인하고 싶을때 찍어보는 용도로 사용한다고 한다. (ex. 디버깅용)
System.out.println("sorted: ");
List<String> langs = Arrays.asList("java","kotlin","haskell","ruby","smalltalk");
langs.stream().sorted()
.forEach(System.out::println);
System.out.println("reversed: ");
langs.stream().sorted(Comparator.reverseOrder())
.forEach(System.out::println);
스트림의 요소들을 정렬하여 새로운 스트림을 생성한다.
sorted()
는 param이 없다. 그렇기 때문에 이를 사용하려면 정렬하려는 객체에 Comparable 인터페이스가 구현되어 있어야 사용이 가능합니다. String은 기본적으로 Comparable이 구현되어 있으므로 Comparator.reverseOrder()
을 사용하여 역순으로 정렬할 수 있다.
IntStream.of(7,5,5,2,1,2,3,5,4,6).distinct().forEach(System.out::println); // 7,5,2,1,3,4,6
중복이 제거되어 Stream을 반환한다.
List<Integer> ages = Arrays.asList(1,2,3,4,5,6,7,8,9);
ages.stream().limit(3).forEach(System.out::println);
ages.stream().filter(x -> x>3).limit(3).forEach(System.out::println);
앞선 n개 요소까지 새로운 Stream을 만든다.
Stream<String> lang1 = Arrays.asList("JAVA","C++","Python").stream();
Stream<String> lang2 = Arrays.asList("Kotlin","Scala","Javascript").stream();
Stream.concat(lang1,lang2)
.forEach(System.out::println);
두 Stream을 파라메터 차례로 연결한다.
List<Integer> integerList = Arrays.asList(20,30,50,88,100);
int[] mapToInt = integerList.stream().mapToInt(x->x).toArray(); // Integer -> int(primitive type)
Stream.of("a1","a2","a3")
.map( s-> s.substring(1) )
.mapToInt(Integer::parseInt)
.max()
.ifPresent(System.out::println); // String -> Int
map과 같은 기능을 가지는데 반환형이 Stream이 아닌 IntStream이라는 점에서 차이가 있다.
감사합니다람쥐