JAVA 8 NEW FEATURE 정리

DYKO·2023년 2월 18일
0

JAVA NEW FEATURES

목록 보기
1/4

람다 표현식(Lambda Expression)

  • 람다식: 메서드로 전달 가능한 익명 함수를 단순화한 것
  • 반복문 적용 예시
    before
      for(String value : myCollection){
          System.out.println(value);
      }
    after
    myCollection.forEach(value -> System.out.println(value));


stream API

  • 배열이나 컬렉션의 데이터를 추상화하여, 공통된 방식으로 데이터를 읽고 쓸 수 있는 방법을 제공
  • 컬렉션은 데이터를 어떻게 저장/관리하고 접근하는지를 목표로 함 → 데이터 저장/관리 시 사용
  • 스트림은 데이터를 어떻게 계산할지에 대한 목포를 가짐 → 계산 시 사용
  • 구성요소
    • 연속된 요소
    • 중간연산
      • 파이프라인으로 구성
      • stream을 반환
      • 최종 연산에서 한번에 처리됨(지연 계산)
      • ex. map, filter, flatMap
    • 최종연산
      - stream이 아닌 최종 결과를 반환
      - ex. count, foreach, collect
      - 예제
      list.stream().filter(s -> s.startsWith(user + " ")).collect(Collectors.toList());
      Stream (Java Platform SE 8 )


메서드 참조(Method References)

  • 람다식을 더 짧고 읽기 쉽게 함

  • 종류

    • 정적 메서드 참조

              // before
              boolean isReal = list.stream().anyMatch(u -> User.isRealUser(u));
              // after
              boolean isReal = list.stream().anyMatch(User::isRealUser);
    • 인스턴스 메서드 참조

              User user = new User();
              // before
              boolean isLegalName = list.stream().anyMatch(u -> user.isLegalName(u));
              // after
              boolean isLegalName = list.stream().anyMatch(user::isLegalName);
    • 특정 유형(String, BigDecimal 등)의 인스턴스 메서드 참조

             // before
             long count = list.stream().filter(s -> String.isEmpty(s)).count();
             // after
             long count = list.stream().filter(String::isEmpty).count();
    • 생성자 참조

              // className::new
              Stream<User> stream = list.stream().map(User::new);


java.time 패키지 추가

  • Date 클래스의 대다수의 메서드는 deprecated 상태
  • Calendar 클래스 사용을 권장, 다만 아래 문제 존재
    • Calendar 인스턴스는 불변 객체가 아님 → 값이 변경될 수 있음
    • 윤초(leap second)와 같은 특별한 상황 고려 안됨
    • 월 표현 시, 0~11로 표현해야 함
  • 이를 해결한 새로운 날짜와 시간 API를 추가함
    java.time (Java Platform SE 8 )


Optional 지원

  • 객체 참조 시, null 참조될 상황을 처리
  • 예제
          @Test
          void testUpdateQuestion() {
          	Optional<Question> oq = this.questionRepository.findById(1);
          	assertTrue(oq.isPresent());
          
          	Question q = oq.get();
          	q.setSubject("수정된 제목");
          	this.questionRepository.save(q);
          }
          ---
          void printAddressStreet(){
          	Optional<User> user = Optional.ofNullable(getUser());
          	String result = user.map(User::getAdress)
          											.map(Address::getStreet)
                                .orElse("not specified");
          
            System.out.println(result);
          }
    Optional (Java Platform SE 8 )


인터페이스 default, static 메서드 추가

  • static 메서드
    • 인터페이스 내부에서만 사용 가능
    • 구현 클래스에서 재정의 불가능
  • default 메서드
    • 구현 클래스에서 사용 가능
    • 구현 클래스에서 재정의 가능
    public interface Callable {
    	static String getUri(){
            return "https://www.java.com";
        }
        
        default String getDefaultUri() {
            return getUri();
        }
    }
    
    ---
    public Class JavaCaller implements Callable {
        private String uri;
        public void call() {
            uri = getUri();        // static method 호출: Error 발생
            uri = getDefaultUri(); // default method 호출: 정상
        }
    }
    
    public Class JavaKoreanCaller implements Callable {
    		// default method는 override하여 사용 가능
        @Override
        public String getDefaultUri(){
            return "https://www.java.com/ko";
        }
    }


참고자료

http://www.tcpschool.com/java/java_intro_java8
https://livenow14.tistory.com/73

profile
엔지니어가 되는 그 날 까지!

0개의 댓글