[모던 자바 인 액션] - 1장 JAVA8, 9, 10의 등장

태히·2024년 4월 17일
0
post-thumbnail

1장의 모든 내용은 뒤에서 자세히 다룹니다,,,

스트림 처리

  • 한 번에 한 개씩 만들어지는 연속적인 데이터 항목들의 모임
  • Java8의 java.util.stream에 스트림 API 추가. (Stream)

동작 파라미터화로 메서드에 코드 전달

병렬성과 공유 가변 데이터

스트림 메서드로 전달하는 코드는 다른 코드와 동시에 실행하더라도 안전하게 실행될 수 있어야 한다. 이러한 코드를 만드려면 공유된 가변 데이터(shared mutable data)에 접근하지 않아야 한다.

synchronized를 사용할 수 있지만 시스템 성능에 악영향을 미친다.

Java8

  • 메서드 참조
//Java8 이전
File[] hiddenFiles = new File(".").listFiles(new FileFilter(){
	public boolean accept(File file) {
		return file.isHidden(); 
	}
});

//Java8
File[] hiddenFiles = new File(".").listFiles(File::isHidden);

메서드 참조를 이용해서 listFiles에 직접 함수를 전달할 수 있다.

  • 람다 : 익명함수

위의 File::isHidden이 람다 형식.

public static List<Apple> filterApples(List<Apple> inventory, Predicate<Apple> p) {
  List<Apple> result = new ArrayList<>();
  for (Apple apple : inventory) {
    if (p.test(apple)) {
      result.add(apple);
    }
  }
  return result;
}
	public interface Predicate<T>{
	boolean test(T t);
}
public static boolean isGreenApple(Apple apple) {
  return "green".equals(apple.getColor());
}

public static boolean isHeavyApple(Apple apple) {
  return apple.getWeight() > 150;
}

filterApples 메서드를 다음처럼 호출할 수 있다.

  • filterApples(inventory, Apple:isGreenApple)
  • filterApples(inventory, Apple:isHeavyApple)

Predicate란?
수학에서 인수로 값을 받아 true나 false를 반환하는 함수를 프레디케이트라고 한다.

  • Stream
    • for문처럼 외부 반복이 아닌, 내부 반복.
    • 주요 기능
      • 필터링
      • 추출
      • 그룹핑
    • 필터링 예시: inventory.stream().filter((Apple a) -> a.getWeight() > 150)).collect(toList());
  • 디폴트 메서드
    • java8 이전에는 List를 구현하는 모든 클래스가 sort를 구현해야 했지만 지금은 따로 구현하지 않아도 됨.

그래서 java 8, 9, 10, 11 많이 달라졌는가?

  • JAVA8 - 메소드전달, 람다 … 기본
  • JAVA9 - 대규모 컴포넌트를 정의하고 사용하는 기능 → 리액티브 프리그래밍
  • JAVA10 - 지역변수 추론
  • JAVA11 - CompletableFuture와 리액티브 프로그래밍 기능을 활용한 비동기 HTTP 클라이언트 라이브러리
profile
하고싶은게 많은 개발자가 되고싶은

0개의 댓글