[JAVA] 함수형 인터페이스

yoon·2023년 12월 14일
0

java

목록 보기
15/19
post-thumbnail

자바에서 함수형 인터페이스를 사용하는 이유는?
1. 람다 표현식 지원
2. 메서드 참조
3. Stream API와의 통합
4. 병렬 프로그래밍
5. 코드 재사용

✅ lambda Expression

메서드를 하나의 식으로 표현한 것으로 함수를 간략하고, 명확하게 표현할 수 있다.
람다식을 익명 함수(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);
}

생성자 참조 → 클래스명::new

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);
}
profile
하루하루 차근차근🌱

0개의 댓글