본문 바로가기
프로그래밍/JAVA

java8 stream의 쉬운 사용방법 (map, filter, collect)

by 애플 로그 2022. 6. 10.
반응형

java8 stream의 쉬운 사용방법 (map, filter, collect)

 

java8부터 지원 되는 대표적인 API인 stream에 대해 알아보려고 한다.

Stream은 컬렉션, 배열에 저장되어 있는 요소들을 하나씩 참조하며 반복적인 처리를 가능하게 한다.

Stream과 람다표현식을 사용하면 for문과 if문을 사용하지 않고도 깔끔하고 직관적이게 코드를 변경 할수있다.

몰라도 당연히 처리 할수 있지만, Strame이 생겨서 컬렉션 배열 계열의 처리가 간단하게 할수 있다 이런말로 요약할수 있다.

 

Stream 특징 몇가지만 알아보자!!

1. Stream은 원본 데이터를 읽기만 하지, 원본데이터 변경을 하지 않는다.

2. Stream은 정렬된 결과를 컬레션이나 배열에 담아 반환 할수있다. ( collect )

3. Stream은 내부 반복문이며, 반복문이 코드상에 노출 되지 않는다.

 

map() : 요소들을 조건에 맞게 변환할수 있다.

  • 원본데이터가 변경되지 않는점을 유심히 보자
    public static void main(String args[]){
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("ball");
        list.add("car");
        list.add("daddy");
        list.add("ear");
        list.add("fox");

        // 요소들을 조건에 해당하는 값으로 변환 해준다.
        // map

        System.out.println("==========stream1=========");
        Stream stream1 = list.stream().map(s -> s.toUpperCase()); // 반복문이 코드상에 노출X
        stream1.forEach(System.out::println);

        System.out.println("=========stream2==========");

        Stream stream2 =list.stream().map(String::toUpperCase); // 반복문이 코드상에 노출X
        stream2.forEach(System.out::println);

        System.out.println("==========원본데이터=========");
        // 원본 데이터는 변경되지 않는다.
        // list.forEach(System.out::println);
        list.forEach(s -> System.out.println(s)); // "System.out::println"와 동일 = 람다 표현식
    }

<결과>

출력 결과는 아래에서 자세히 확인해 보시기 바랍니다.

==========stream1=========
APPLE
BALL
CAR
DADDY
EAR
FOX
=========stream2==========
APPLE
BALL
CAR
DADDY
EAR
FOX
==========원본데이터=========
apple
ball
car
daddy
ear
fox

 

filter() : 스트림내에 있는 요소에 대해 필터링 한다.

   public static void main(String args[]){
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("ball");
        list.add("car");
        list.add("daddy");
        list.add("ear");
        list.add("fox");

        // filter
        // 문자 3자 이상만
        Stream stream1 =  list.stream().filter(s -> s.length() > 3);
        stream1.forEach(System.out::println);

        System.out.println("==============================");

        // 문자가 a로 시작하는 것만
        Stream<String> stream2 =  list.stream().filter(s -> s.startsWith("a"));
        stream2.forEach(System.out::println);
    }

 

<결과>

출력된 결과에 대해 아래에서 자세히 확인해 보시기 바랍니다.

apple
ball
daddy
==============================
apple

 

collect() : Stream 데이터를 원하는 자료형으로 변환 해준다.

위의 예제와 같이 filter로 데이터를 추출했다고 가정하면, 컬렉션이나 배열로 변환해서 반환 할수 있다.

 

    public static void main(String args[]){
        List<String> list = new ArrayList<>(Arrays.asList("apple","ball","car","daddy","ear","fox"));

        System.out.println("===============counting()===============");
        Long count =  list.stream().filter(s -> s.length() > 3).collect(counting());
        System.out.println("count - " + count);

        System.out.println("================Collectors.toList==============");
        List nList =  list.stream().filter(s -> s.length() > 3).collect(Collectors.toList());
        System.out.println(nList);

        System.out.println("================Collectors.joining==============");

        // list의 아이템을 1개의 String으로 만들기 ( 구분자 "," )
        String longStr =  list.stream().filter(s -> s.length() > 3).collect(Collectors.joining(","));
        System.out.println(longStr);

        System.out.println("===============Collectors.toMap===============");

        Map map =  list.stream().filter(s -> s.length() > 3).collect(Collectors.toMap(s -> s, s-> s.length()));
        map.forEach((a, b) -> {
            System.out.println(a + " " + b);
        });

        System.out.println("===============toArray()===============");
        Object[] obj  =  list.stream().filter(s -> s.length() > 3).toArray();
        for (Object o : obj) {
            System.out.println((String) o);
        }
    }

 

<결과>

출력된 결과에 대해 아래에서 자세히 확인해 보시기 바랍니다.

===============counting()===============
count - 3
================Collectors.toList==============
[apple, ball, daddy]
================Collectors.joining==============
apple,ball,daddy
===============Collectors.toMap===============
ball 4
apple 5
daddy 5
===============toArray()===============
apple
ball
daddy

 

 

 

 

java8 stream List를 Map으로 변환

java8 stream List를 Map으로 변환 자바 Stream이란? 자바 스트림 이란 자바8에 추가된 기능으로 컬렉션과배열 등 데이터를 처리하는데 아주 유용한 기능이다. 비유를 하자면 물이 스트림을 타고 흐르는

www.appletong.com

 

 

자바 String 원하는 문자열 추출 (indexOf, subString, chatAt, token, parseInt )

자바 String 원하는 문자열 추출 정리 자바 String 관련해서 자르고 추출하고, 있는지 검사에 대한 자주쓰는 기본 메서드에 대해 정리한다. indexOf(String a) = a의 문자의 위치 값을 숫자를 얻는다. lastin

www.appletong.com

 

댓글