본문 바로가기

Java/Java8

(JAVA8) 스트림의 활용 (2)

filter의 사용

List<Integer> numbers = Arrays.asList(1,2,1,3,3,2,4);
numbers.stream()
        .filter((Integer i) -> i %2 == 0)
        .forEach(System.out::println);

실행결과


distinct의 사용

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

실행결과

https://seopsblog.blogspot.com/2016/05/java8.html

 

[JAVA8] 중복제거 하기

웹개발관련 블로그 입니다.

seopsblog.blogspot.com


skip() - 요소 건너뛰기

List<Dish> dishes = menu.stream()
                        .filter(d -> d.getCalories() > 300)
                        .skip(2)
                        .collect(Collectors.toList())
                        ;
System.out.println(dishes);

 

 

처음 300 칼로리가 넘는 두 항목을 건너뛰고 조건에 해당하는 나머지 요리를 반환


map() - 매핑 

오라클의 groupBy라고 생각하면 될 것 같다.

 

요리의 이름으로 매핑

List<String> dishesmap = menu.stream()
                             .map(Dish::getName)
                             .collect(Collectors.toList());
System.out.println(dishesmap);

요리의 이름으로 그룹화한 이후 해당 요리 이름의 길이로 매핑

List<Integer> dishesmap2 = menu.stream()
                                .map(Dish::getName)
                                .map(String::length)
                                .collect(Collectors.toList());
System.out.println(dishesmap2);

실행결과

위의 조건으로 매핑하기 이전에 필터로 700 칼로리가 넘는 항목으로 필터링

List<String> dishesmap = menu.stream()
                             .filter(d -> d.getCalories() > 700)
                             .map(Dish::getName)
                             .collect(Collectors.toList());

실행결과 (첫 번째)


flatMap -스트림 평면화

List<String> strList = Arrays.asList("Hello","World");
List<String[]> collect = strList.stream()
                                .map(s -> s.split(""))
                                .distinct()
                                .collect(Collectors.toList());

해당 스트림의 결과 값의 타입이  List <String []>라는 점에 주목하자

map으로 전달한 람다는 각 단어의 문자열 배열을 반환하기 때문이다.

따라서 이 코드를 출력하려면 

for (String[] str : collect) {
    for(int i=0;i<str.length; i++) {
        System.out.println(str[i]);
    }
}

위와 같은 과정을 거쳐야 한다.

 

우리가 원하는 것은 정확하게 Stream <String>이다. (문자열 배열이 아닌)

 

해결 방법 1. Arrays.stream 적용

List<Stream<String>> collect = strList.stream()
                                      .map(s -> s.split(""))
                                      .map(Arrays::stream)
                                      .distinct()
                                      .collect(Collectors.toList());

이것 또한 Stream의 리스트를 타입으로 만들어 준다.

map을 스트림화 하는 과정에서 ""로 나누어진 map을 각각의 스트림으로 만들기 때문이다.

 

flatMap의 등장

List<String> collect = strList.stream()
                                .map(s -> s.split(""))
                                .flatMap(Arrays::stream)
                                .distinct()
                                .collect(Collectors.toList());

실행결과

이유는 평 면화된 스트림을 반환하기에 가능한 것이다.

 


Code Link

https://github.com/mike6321/PURE_JAVA/tree/master/Java8/2Week/lamda

 

mike6321/PURE_JAVA

Contribute to mike6321/PURE_JAVA development by creating an account on GitHub.

github.com

References

자바 8 인 액션
국내도서
저자 : 라울-게이브리얼 우르마(RAOUL-GABRIEL URMA),마리오 푸스코(MARIO FUSCO),앨런 마이크로프트(ALAN MYCROFT) / 우정은역
출판 : 한빛미디어 2015.04.01
상세보기