자바에서 함수형 인터페이스를 사용하는 이유는?
1. 람다 표현식 지원
2. 메서드 참조
3. Stream API와의 통합
4. 병렬 프로그래밍
5. 코드 재사용
메서드를 하나의 식으로 표현한 것으로 함수를 간략하고, 명확하게 표현할 수 있다.
람다식을 익명 함수(anonymous function)라고도 한다.
람다식은 함수형 인터페이스와 함께 사용된다.
//(int x, int y)->{return x+y;}
@FunctionalInterface
interface MathOperation{
int operate(int x, int y);
}
public static void main(String[] args){
MathOperation add = (x,y)->x+y;
}
@FunctionalInterface
public interface StringOperation {
String apply(String s);
}
public class LambdaApply {
public static void main(String[] args) {
StringOperation toUpperCase = s->s.toUpperCase();
StringOperation toLowerCase = s->s.toLowerCase();
System.out.println(toLowerCase.apply("AAA"));
System.out.println(processString("aaa",toUpperCase));
}
public static String processString(String input, StringOperation operation){
return operation.apply(input);
}
}
//example
@FunctionalInterface
public interface Converter<T,F>{
T converter(F from);
}
public class IntegerUtils{
public static int stringToInt(String s){
return Interger.parseInt(s)
}
}
public static void main(String[] args){
Converter<String, Integer> converter = IntegerUtils::stringToInt;
Integer result = converter.coverter("123");
}
public class StringUtils{
public static int reverse(String s){
return new StringBuilder(s).reverse().toString();
}
}
public static void main(String[] args){
StringUtils str=new StringUtils();
Converter<String, String> converter = str::reverse;
String result = converter.coverter("hello");
}
public static void main(String[] args){
List<String> names = Arrays.asList("Kim","Park","Lee");
Collections.sort(names, String::compareTo);
}
public class Person{
String name;
int age;
Person(String name, int age){
this.name = name;
this.age = age;
}
}
interface PersonFactory{
Person create(String name, int age);
}
public static void main(String[] args){
//익명클래스 (이전 방법)
PersonFactory personFactory = new PersonFactory(){
@Override
public Person create(String name, int age){
return new Person(name,age);
}
};
Person person = personFactory.create("Lee",20);
//생성자 참조
PersonFactory personFactory = Person::new;
Person person = personFactory.create("Lee",20);
// 람다 표현식
PersonFactory personFactory = (name,age)->new Person(name,age);
Person person = personFactory.create("Lee",20);
}