[Java] Stream , Optional 활용 백서

BlackBean99·2022년 5월 9일
2

Java

목록 보기
1/3


뿌우우 무난하게 흘러가던 나의 개발 여정. 하지만 늘 고난은 있었죠.
Map, Optional, Stream, filter 무슨 개념인지 모르고 사용하던 당신! 바 로 나..
지금부터라도 확실하게 이해하고 넘어갑시다! 알고나면 더 머어찐 개발자!!

[주의] : 오늘 나오는 개념은 Java 8 이후 추가된 기능입니다.


Stream이 뭘까요?

Java 8 이전에 List에 담아 처리하던 것을 반복문(for each, for ) 문으로 하나씩 조회하면서 처리했지만
변화없이 똑같이 코드를 짜다 보니 불편하고 보기도 불편해.. 그래서 해결했다 Stream

Collection, Array, 등 연속된 데이터를 filter, match, map 등등 다양한 기능을 제공하여 더 편리하게 처리할 수 있습니다!

Collection 을 쓰지 이걸 왜쓰냐? 비교하는 내용은 다른 포스팅때.. ㅎㅎ 오늘은 어떻게 사용할지만 작성하겠다!

Stream 의 특징은?

  • 계산식(람다)을 표현하는 것이 주요 관심사이다.
  • 데이터에 접근하는 방법이 추상화되어있다.
  • 계산식을 미리 적어두고 계산시에 람다식으로 JVM에 넘긴다.
  • 메모리 사용량이 줄어든다.
  • 데이터 소스를 변경하지 안흔ㄴ다.
  • 최종 연산이 실행 될 때에 데이터가 계산된다.

       List<Integer> list = Arrays.asList(1,2,3,4);
	   // .stream() 을 작성하면   Stream 으로 변환된다.
       //Stream
       Stream<Integer> stream = list.stream();
       stream.forEach(number -> System.out.println("값 ::: " + number));

그럼 반복문 사용해서 조회할때 이거 사용하면 돼?

그것뿐인줄 알어? Stream 의 기능들을 지금부터 보여주지

Stream 기능

1. Filtering

  • 조건에 따라 데이터를 걸러낸다.
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);

       //Stream
       Stream<Integer> stream = list.stream();
       stream.filter(i -> i %2 ==0)
                .forEach(number -> System.out.println("값 ::: " + number));
                

Arrow Function 을 조건으로 사용합니다.

2. Map

  • 특정 조건에 해당되는 값으로 변환
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);

        //Stream
        Stream<Integer> stream = list.stream();
        stream.filter(i -> i %2 ==0)
                .map(i-> i*2)
                .forEach(number -> System.out.println("값 ::: " + number));

3. 정렬

요소들을 정렬한다.

 List<Integer> list = Arrays.asList(1,2,3,4,5,1,2,3,4,5);
        
        //Stream
        Stream<Integer> stream = list.stream();
        stream.sorted()
                .forEach(number -> System.out.println("값 ::: " + number));
  • forEach(Arrow Function ) 형식으로 뒤에 붙여서 각원소마다 출력 및 명령어를 쓸 수 있다.

이정도 사용법을 보면 대충 감이 온다. 맞아 내가 그렇다.

그럼 다음 개념!

Optional 은?

Null 값을 포함하거나 하지 않을 수 있는 컨테이너 객체다.

실제로 개발을 하다 보면 null을 사용하면 오류가 발생할 가능성이 있는 메서드의 반환 유형으로 사용하기 위해 사용한다. Optional 인 변수는 자체적으로 null이 아니어야 한다. 항상 Optional 인스턴스를 가리켜야 한다.

실제로 NPE ( Null Point Exception ) 을 처리할때 사용하기도 한다. 아래 코드를 한번 살펴볼까?

 Map<Integer,String> name = new HashMap<>();
        name.put(1,"철수");
        name.put(2,"영희");
        name.put(3, "길동");
        
	//Optional X
        String searchName = name.get(4); // null 발생
        if(searchName == null){
            new Exception("값이 없습니다.");
        }else{
            System.out.println("이름 ::: " + searchName);
        }
        
	// Optional O
 	Optional<String> nameOptaionl = Optional.ofNullable(name.get(4));
        nameOptaionl.orElseThrow(() -> new Exception("값이 없습니다."));
        System.out.println("이름 ::: " + nameOptaionl.get());

Optional 기능

  1. of : Optional에 값이 반드시 있어야 하는 경우에 값을 넣어주는 역할을 한다.
		Optional<Integer> optional = Optional.of(1);
        System.out.println(optional.get());
  1. ofNullable : null 인 경우 비어있는 Optional을 반환
 		List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8);
        Optional<Integer> optional =  Optional.ofNullable(list.get(9));
  1. orElse : 값이 null 이 되던 말던 항상 대체 값을 반환
		List<String> list = Arrays.asList("김범수","나얼","박효신","이수", null);
        System.out.println("단어 ::: " + Optional.ofNullable(list.get(4)).orElse("없음"));
  1. orElseGet :
		List<String> list = Arrays.asList("김범수","나얼","박효신","이수", null);
		System.out.println("단어 ::: " + Optional.ofNullable(list.get(4)).orElseGet(() -> "데이터 없음"));
  1. get : Optional 안에 존재하는 값을 가져옴

  2. orElseThrow : 포함된 값이 있으면 반환하고 아닌 경우 예외 발생시킨다.

  3. IsPresent : 내부 객체가 null 인지 아닌지를 판단 ( boolean )

[Refence] https://velog.io/@gjrjr4545/JAVA-8-3-Stream-Optional%EC%9D%98-%EB%93%B1%EC%9E%A5

profile
like_learning

0개의 댓글