1장의 모든 내용은 뒤에서 자세히 다룹니다,,,
스트림 메서드로 전달하는 코드는 다른 코드와 동시에 실행하더라도 안전하게 실행될 수 있어야 한다. 이러한 코드를 만드려면 공유된 가변 데이터(shared mutable data)에 접근하지 않아야 한다.
synchronized
를 사용할 수 있지만 시스템 성능에 악영향을 미친다.
//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를 반환하는 함수를 프레디케이트라고 한다.
inventory.stream().filter((Apple a) -> a.getWeight() > 150)).collect(toList());