본문 바로가기

[모던 자바 인 액션] 1장

Collctions.sort(inventory, new Comparator<Apple>() {
	public int compare(Apple a1, Apple a2) {
    	return a1.getWeight().compareTo(a2.getWeight());
    }
}

inventory.sort(comparing(Apple::getWeight));

 

자바 8 설계의 밑바탕을 이루는 세 가지 프로그래밍 개념

1. 스트림 처리(stream processing)

- 스크림이란 한 번에 한 개씩 만들어지는 연속적인 데이터 항목들의 모임이다. 

- 자바 8에서는 java.util.stream 패키지에 스트림 API가 추가되었다.

- 스레드라는 복잡한 작업을 사용하지 않으면서도 공짜로 병렬성을 얻을 수 있다. 

2. 코드 일부를 API로 전달하는 기능

- 자바 8에서는 메서드(우리 코드)를 다른 메서드의 인수로 넘겨주는 기능을 제공

- 동작 파라미터화(behavior parameterzation)

3. 병렬성과 공유 가변 데이터

- 스트림 메서드로 전달하는 코드는 다른 코드와 동시에 실행하더라도 안전하게 실행될 수 있어야 한다. 

- 보통 다른 코드와 동시에 실행하더라도 안전하게 실행할 수 있는 코드를 만들려면 공유된 가변 데이터에 접근하지 않아야 한다. 

- 이러한 함수를 순수 함수, 부작용 없는 함수, 상태 없는 함수

 

프레디케이트(predicate) ->> JPA에서나오는것도이거인가..

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

 

for-each 루프를 이용해서 각 요소를 반복하면서 작업을 수행 -> 외부 반복 (external iteration)

스트림 API 라이브러리 내부에서 모든 데 이터가 처리 -> 내부 반복 (internal iteraton)

 

자바함수

1. 메서드와 람다를 일급 시민으로 ->> 일급 시민..이해가 안되네..

메서드참조

File[] hiddenFiles = new File(".").listFiles(new FileFilter() {
	public boolean accept(File file) {
    	return file.isHidden(); // 숨겨진 파일 필터링!
    }
});

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

람다 : 익명함수

public static List<Apple> filterGreenApples(List<Apple> inventory) {
	List<Apple> result = new ArrayList<>();
    
    for (Apple apple : inventory) {
    	if (GREEN.equals(apple.getColor))) {
        	result.add(apple);
        }
    } 
    return result;
}
// 
public static boolean isGreenApple(Apple apple) {
	return GREEN.equals(apple.getColor);
}
public interface Predicate<T> {
	boolean test(T t);
}
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);
        }
    }
}
filterApples(inventory, Apple::isGreenApple);
// 조건을 추가하기 편하다 

 

자바 8은 스트림 API(java.util.stream)로 

1. 컬렉션을 처리하면서 발생하는 모호함과 반복적인 코드 문제

2. 멀티 코어 활용 어려움 해결 

 

Optional<T> -> NullPoint 예외를 피할 수 있음.