클래스 내부에 있는 클래스
자바는 객체지향 프로그램 언어이기 때문에 자바에서 함수형 프로그래밍을 구현하는 방식으로 람다식을 제공한다. 클래스를 생성하지 않고 함수의 호출만으로 기능을 수행하는 방식이다.
순수 함수(pure function)를 구현하고 호출함.
순수 함수
병렬 처리가 가능하다. (외부 자료에 영향을 미치지 않기 때문에 side effect가 없어 여러 함수가 동시에 수행될 수 있다.)
함수 이름과 반환 형을 없애고 ->를 사용한다. {}까지가 실행문을 의미
(int x, int y) -> {return x + y;}
함수형 인터페이스
자바는 객체 지향 언어로 객체를 생성해야 메서드가 호출된다. 따라서 람다식으로 메서드를 구현하고 호출하면 내부에서 익명 클래스가 생성된다. 이 람다식에서 외부 메서드의 지역변수는 상수로 처리 됨(지역 내부 클래스와 동일한 원리)
@FunctionalInterface
interface StringConcat {
public void makeString(String s1, String s2);
}
public class TestStringConcat {
public static void main(String[] args) {
StringConcat concat = (s1, s2) -> System.out.println(s1 + ", " + s2);
concat.makeString("hello", "java");
// 내부적으로 생성되는 구현부
StringConcat concat = new StringConcat(){
@Override
public void makeString(String s1, String s2){
System.out.println(s1 + ", " + s2);
}
};
}
}
일관성 있는 연산을 처리할때, 자료를 더 효율적으로 연산할 수 있도록 제공되는 객체이다.
정의된 연산이 아닌 프로그래머가 직접 지정하는 연산을 적용할 수 있다.
최종 연산으로 스트림의 요소를 소모하여 연산을 수행
String[] greetings = {"안녕", "hello", "Good morning", "hi"};
// 직접 람다식 구현하는 방법
System.out.println(Arrays.stream(greetings).reduce("", (s1, s2) -> {
if(s1.getBytes().length >= s2.getBytes().length)
return s1;
else return s2;
}));
// 연산을 구현한 클래스를 사용하는 방법
String str = Arrays.stream(greetings).reduce(new CompareString()).get();