본문 바로가기

Java

JAVA Stream API 란?

728x90
반응형

JAVA Stream ?

JAVA 8에서 추가된 기능으로 Array나 Collections 처럼 연속된 형태의 객체를 데이터로 받아서 method로 처리하는 기능이다.

입력된 데이터의 자료구조 자체를 변경하지 않고 결과를 파이프라인 형태로 제공한다.

Stream API를 쓰는 이유는 가독성을 향상시키고 성능을 향상시키기 위해서이다.

Stream 형태로 한 번 사용후에는 재사용이 불가능한 일회성이다.

 

Stream 사용 전

String[] strArr = { "Best Friends", "Apple Ice Cream", "Island" };
List<String> strList = Arrays.asList(strArr);

Arrays.sort(strArr);
Collections.sort(strList);

for(String str: strArr) {
	System.out.println(str);
}

for(String str : strList) {
	System.out.println(str);
}

Stream 사용 후 

Stream<String> arrayStream = Arrays.asList(strArr).stream();
Stream<String> listStream = strList.stream();

arrayStream.sorted().forEach(s-> System.out.println(s));
listStream.sorted().forEach(System.out::println);

코드가 훨씬 간결하고 깔끔해졌다.

 

 

Arrays.stream() 혹은 Collections.stream()으로 생성할 수 있는데 직접 생성도 가능하다.

직접 생성하는 방법 

// null 대신 사용가능
Stream stream = Stream.empty();

// build로 생성 가능 
Stream<String> streamTest = Stream.<String>builder().add("hello").build();

// Generate로 생성 가능 
Stream<String> generatorStream = Stream.generate(()->"gen").limit(5);

// 기본형타입으로 생성가능 
IntStream intStream = IntStream.range(1, 5);

 

 

filter

중간연산자로 원하는 데이터만 추출한다. 

List<String> names = Arrays.asList("Hello", "World", "Test", "array");

        names = names.stream()
                .filter(it -> it.contains("e"))
                .collect(Collectors.toList());

이렇게 하면 e가 포함된 값만 names에 저장할 수 있다.

 

map

스트림내의 요소를 가공한다. 

  Arrays.asList(3, 8, 9, 10, 20, 11, 22)
                .stream().map(it -> it * it)
                .forEach(System.out::println);

        Arrays.asList("Hello", "World", "Test", "array")
                .stream().map(String::toUpperCase)
                .forEach(System.out::println);

flapMap

중첩된 구조를 없애고 단일 stream으로 바꿔준다.

List<String> list1 = List.of("white", "black");
        List<String> list2 = List.of("red", "green");

        List<List<String>> streamList = List.of(list1, list2);

        streamList.stream().flatMap(list -> list.stream())
                .sorted()
                .collect(Collectors.toList())
                .forEach(System.out::println);
tring arr[][] = {
                {"one", "zero", "seven"},
                {"two", "Three", "nine"},
                {"Four", "Five", "Six"},
                {"eight", "ten"}
        };

        Stream.of(arr)
                .flatMap(Stream::of)
                .forEach(System.out::println);

이렇게도 가능

 

distinct(), sorted()

중복제거와 정렬도 가능 

int[] arr = {1, 2, 3, 3, 4, 5, 8, 9, 9};

Arrays.stream(arr).distinct().sorted().forEach(System.out::println);

 

728x90
반응형

'Java' 카테고리의 다른 글

JAVA 직렬화란? 직렬화 사용이유  (0) 2022.02.02
java static 사용이유 생성자 대신 static 팩토리 메소드  (0) 2021.12.18
JAVA Optional  (0) 2021.02.03
JAVA lamda란  (0) 2021.01.29
JAVA ClassLoader 란 ?  (0) 2020.12.22