창고

Stream

날아갔나요 2017. 10. 3. 23:08



중간 연산


연산 

형식 

반환형식 

연산의 인수 

함수 디스크립터 

 filter 

 중간 연산 

 Stream<T>

 Predicate<T> 

 T -> boolean 

 map 

 중간 연산 

 Stream<T> 

 Function<T, R>

 T -> R

 limit

 중간 연산 

 Stream<T>

 

 

 sorted

 중간 연산 

 Stream<T>

 Comparator<T>

 (T, T) -> int

 distinct

 중간 연산 

 Stream<T>

 

 



최종 연산


 연산

 형식

 목적

 forEach

 최종 연산

 스트림의 각 요소를 소비하면서 람다를 적용한다. void를 반환

 count

 최종 연산

 스트림의 요소 개수를 반환한다. long을 반환

 collect

 최종 연산

 스트림을 리듀스해서 리스트, 맵, 정수 형식의 컬렉션을 만든다.








필터링과 슬라이싱


distinct

        List<Integer> numbers = Arrays.asList(1213324);
        numbers.stream()
            .filter(i -> i%2==0)
            .distinct()
            .forEach(System.out::println);
cs


limit

        List<Integer> numbers = Arrays.asList(12133246);
        numbers.stream()
            .filter(i -> i%2==0)
            .distinct()
            .limit(2)
            .forEach(System.out::println);
cs


skip

        List<Integer> numbers = Arrays.asList(12133246);
        numbers.stream()
            .filter(i -> i%2==0)
            .distinct()
            .skip(1)
            .forEach(System.out::println);
cs







매핑


map

        List<Integer> nameSize = productList.stream()
                                    .map(Product::getName)
                                    .map(String::length)
                                    .collect(Collectors.toList());
cs


Arrays.stream

       String strings[] = new String[]{"hello""world"};
        Stream<String> strStream = Arrays.stream(strings);
cs


잘못된 예

        List<String> charList = strStream
                .map(word -> word.split(""))
                .map(Arrays::stream)
                .distinct()
                .collect(Collectors.toList());
cs

Stream<String[]>

Stream<Stream<String>>

이 되기때문에 컴파일 에러가 난다.


flatMap : 각 배열을 스트림이 아니라 스트림의 콘텐츠로 매핑한다.

        List<String> charList2 = strStream
                .map(word -> word.split(""))
                .flatMap(Arrays::stream)
                .distinct()
                .collect(Collectors.toList());
cs







검색과 매칭

쇼트서킷 기법을 이용함


anyMatch

        if(productList.stream().anyMatch(p -> p.name.equals("TV"))) {
            System.out.println("I have TV");
        }
cs


allMatch

        if(productList.stream().allMatch(p -> p.price>300000)) {
            System.out.println("I haven't cheap product");
        }
cs


noneMatch

        if(productList.stream().noneMatch(p -> p.price>300000)) {
            System.out.println("I have cheap product");
        }
cs


findAny

        Optional<Product> product = productList.stream()
                .filter(p -> p.price>1000000)
                .findAny();
cs


findFirst

        Optional<Product> product = productList.stream()
                .filter(p -> p.price>1000000)
                .findFirst();
cs








리듀싱


        List<Integer> numbers = Arrays.asList(12345678910);
        int sum = numbers.stream().reduce(0, (a, b) -> a+b);
cs








숫자형 스트림

IntStream에 경우 사용할 수 있는 메서드

sum, max, min, average 등


매핑

        int sumPrice = productList.stream()
                .mapToInt(Product::getPrice)
                .sum();
cs


객체스트림으로 복원

        Stream<Integer> priceStream = productList.stream()
                .mapToInt(Product::getPrice)
                .boxed();
cs


OptionalInt

        OptionalInt maxPrice = productList.stream()
                .mapToInt(Product::getPrice)
                .max();
        System.out.println(maxPrice.orElse(0));
cs


range

        int oddSum = IntStream.range(011)
                .filter(i -> i%2==1)
                .sum();
cs


rangeClosed

        int evenSum = IntStream.rangeClosed(110)
                .filter(i -> i%2==0)
                .sum();
cs








스트림 만들기


값으로 스트림 만들기

        Stream<String> strStream = Stream.of("Hello""World");
cs


배열로 스트림 만들기

        String strings[] = new String[]{"Hello""World"};
        Stream<String> strStream = Arrays.stream(strings);
cs


파일로 스트림 만들기

        try {
            Stream<String> lines = Files.lines(Paths.get("example.txt"), Charset.defaultCharset());
            lines.flatMap(line -> Arrays.stream(line.split(" ")))
                .forEach(System.out::println);
        } catch(IOException e) {
            e.printStackTrace();
        }
cs


함수로 무한 스트림 만들기


iterate

        Stream.iterate(1, i->i+1)
            .filter(i -> i%2==0)
            .limit(10)
            .forEach(System.out::println);
cs


generate : Supplier를 통해 인수를 받는다

        Stream.generate(Math::random)
            .map(d -> d*44+1)
            .mapToInt(Double::intValue)
            .distinct()
            .limit(6)
            .forEach(System.out::println);
cs