개발일지(일간)

22년 11월 17일 자바 기초 문법

move2 2022. 11. 17. 20:56

자바 문법 기초를 마무리했다.

1.람다

람다식이란 '식별자 없이 실행 가능한 함수' 라고 말할 수 있다. 함수의 이름을 따로 정의하지 않아도 곧바로 함수처럼 사용할 수 있다.

람다를 사용하여서 만든 익명 함수는 재사용이 불가능하며,  람다만을 사용할 경우 비슷한 메소드를 중복되게 생성할 가능성이 있다.

 

람다식의 형식

[기존의 메소드 형식]
반환타입 메소드이름(매개변수 선언) {
    수행 코드 블록
}

[람다식의 형식]
반환타입 메소드이름(매개변수 선언) -> {
    수행 코드 블록
}

람다식 예제

import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> strList = new ArrayList<>(Arrays.asList("korea", "japan", "china", "france", "england"));
        Stream<String> stream = strList.stream();
        stream.map(str -> str.toUpperCase()).forEach(it -> System.out.println(it));
    }
}

소문자가 대문자로 바뀌어 출력된다.

2.스트림

스트림은 데이터의 흐름 이라고 한다.

스트림은 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자이다.

스트림을 활용해서 필터링,데이터 변경, 다른 타입이나 자료구조로 변환 등을 할 수 있다.

스트림은 데이터 소스를 변경하지 않고, 작업을 내부적으로 반복 처리하며, 컬렉션의 요소를 모두 읽고 나면 닫혀서 재사용이 불가능하다. 그러므로 필요할 경우 재생성을 해야한다는 특징을 가지고 있다.

 

1.스트림 생성

스트림을 이용하기 위해 먼저 스트림을 생성해야한다.

Stream<T> Collection.stream() 을 이용하여 해당하는 컬렉션을 기반으로하는 스트림을 생성할 수 있다.

2.중간 연산

중간 단계로써 데이터의 형변환 혹은 필터링, 정렬 등 스트림에 대한 가공을 해준다.

map(변환) / sorted(정렬) / skip(스트림 자르기) / limit(스트림 자르기) 등이 있다.

3.최종 연산

스트림의 요소를 소모해서 결과를 반환하는 단계이다. 최종 연산 이후에는 스트림이 닫히게 되고 더 이상 사용할 수 없다.

최종 연산의 결과값은 단일 값일 수도 있으며 배열 혹은 컬렉션일 수도 있다.

collect()를 이용해서 다른 콜렉션으로 바꾸는 것, reduce를 이용해서 incremental calculation하는 것도 가장 많이 쓰이는 패턴이다.

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("서울");
        list.add("부산");
        list.add("속초");
        list.add("서울");

        System.out.println(list);
        List<String> result = list.stream() // 스트림 생성
                .limit(2) //중간 연산
                .collect(Collectors.toList()); // 최종 연산
        System.out.println(result);

        System.out.println("list -> transformation -> set");
        Set<String> set = list.stream()
                .filter("서울"::equals)
                .collect(Collectors.toSet());
        set.forEach(System.out::println);
    }
}

위 예제의 result에서는  .stream()으로 스트림을 생성하였다. 그리고.limit 으로 중간연산을 한뒤 .collect()를 이용하여 다른 콜렉션으로 바꿔줌으로써 최종연산을 하고, 스트림을 닫았다. 값은 limit(2)가 되어 리스트의 형태로 서울, 부산 만 나오게 된다. 그 아래의 set에서는 set의 형태로 서울만 출력된다.

예제