본문으로 바로가기

[자바]6. 표준API의 함수적 인터페이스

category Language/자바 2021. 4. 3. 15:50
728x90
반응형
SMALL

🤖 자바 8부터 빈번하게 사용되는 함수적 인터페이스는

        java.util.function 표준 API 패키지로 제공한다.

이 패키지에서 제공하는 함수적 인터페이스의 목적은

메소드 또는 생성자의 매개 타입으로 사용되어 람다식을 대입할 수 있도록 하기 위해서이다.

 

*패키지의 함수적 인터페이스5가지

 

예제를 보며 이해하자

 

*Consumer

package lamdaCons;

import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.DoubleConsumer;
import java.util.function.ObjDoubleConsumer;
import java.util.function.ObjIntConsumer;

public class ConsumerExample {
	public static void main(String[] args) {
		Consumer<String> consumer=t -> System.out.println(t+"8");
		consumer.accept("java");
		
		BiConsumer<String, String>bigConsumer=(t,u)->System.out.println(t+u);
		bigConsumer.accept("java", "8");
	
		DoubleConsumer doubleConsumer=d->System.out.println("java"+d);
		doubleConsumer.accept(8.0);
		
		ObjIntConsumer<String> objIntConsumer=(t,i)-> System.out.println(t+i);
		objIntConsumer.accept("java", 8);
	}

}

 

*Supplier

package lamdaSuppl;

import java.util.function.IntSupplier;

public class SupplierExample {

	public static void main(String[] args) {//리턴값만 존재
		IntSupplier intSupplier=()->{
			int num=(int)(Math.random()*6)+1;
			return num;
		};
		
		int num=intSupplier.getAsInt();
		System.out.println("눈의 수: "+num );
		
	}

}

*Function

package lamdaFunc;

public class Student {
	private String name;
	private int englishScore;
	private int mathScore;
	
	public Student(String name, int englishScore, int mathScore) {
		this.name = name;
		this.englishScore = englishScore;
		this.mathScore = mathScore;
	}

	public String getName() {
		return name;
	}

	public int getEnglishScore() {
		return englishScore;
	}

	public int getMathScore() {
		return mathScore;
	}
	
	

}
package lamdaFunc;

import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.function.ToIntFunction;

public class FunctionExample1 {
	private static List<Student>list=Arrays.asList(
		new Student("홍길동",90,96),
		new Student("윤주영",95,93)
	);
	
	public static void printString( Function<Student,String>function) {
		for(Student student : list) {
			System.out.println(function.apply(student)+" ");
		}
		System.out.println();
	}
	
	public static void printInt(ToIntFunction<Student>function) {
		for(Student student : list) {
			System.out.println(function.applyAsInt(student)+" ");
		}
		System.out.println();
	}
	

	public static void main(String[] args) {
		System.out.println("[학생이름]");
		printString(t->t.getName());
		
		System.out.println("[영어 점수]");
		printInt(t->t.getEnglishScore());
		
		System.out.println("[수학 점수]");
		printInt(t->t.getMathScore());
		
	}

}

 

 

*Operator

package lamdaOper;

import java.util.function.IntBinaryOperator;

public class OperatorExample {
	private static int[] scores= {92,95,87};

	public static int maxOP(IntBinaryOperator operator) {//매개변수와 리턴값이 있다. 허나 해당 메소드들은 매개값을 리턴값으로 매핑보다는 매개값을 이요해 연산을 수행한후 동일타입으로 
		// 리턴한다.
		int result=scores[0];
		for(int score: scores) {
			result=operator.applyAsInt(result, score);
		}
		return result;
	}
	public static void main(String[] args) {
		int max=maxOP(
				(a,b)->{
					if(a>=b) return a;
					else return b;
				});
		
		System.out.println("최대값: " + max);
		
		int min=maxOP((a,b)->{if(a<=b) return a; else return b;});
		System.out.println("최소값: " + min);

	}

}

 

*Predicate

package lamdaPredic;

public class Student {
	private String name;
	private String sex;
	private int score;
	
	public Student(String name, String sex, int score) {
		this.name = name;
		this.sex = sex;
		this.score = score;
	}

	public String getName() {
		return name;
	}

	public String getSex() {
		return sex;
	}

	public int getScore() {
		return score;
	}
	
	
}
package lamdaPredic;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

public class PredicateExample {
	private static List<Student> list=Arrays.asList(
			new Student("홍길동", "남자", 90),
			new Student("벤", "여자", 95),
			new Student("김범수", "남자", 100),
			new Student("에일리", "여자", 85)
			);
	
	public static double avg(Predicate<Student> pre) { // 매개값, 리턴은 boolean값
		int count=0;
		int sum=0;
		
		for(Student student: list) {
			if(pre.test(student)) {
			count++;
			sum+=student.getScore();
		}
	}
	return (double)sum/count;

}
	
	public static void main(String[] args) {
		double maleAvg=avg(t->t.getSex().equals("남자"));
		System.out.println("남자 평균 점수: "+maleAvg);
		
		double femaleAvg=avg(t->t.getSex().equals("여자"));
		System.out.println("여자 평균 점수: "+femaleAvg);
	}


}

728x90
반응형
LIST

'Language > 자바' 카테고리의 다른 글

[자바]8. hashCode() 와 equals()의 차이  (0) 2021.04.22
[자바] 7. 컬렉션 프레임워크  (0) 2021.04.06
[자바]5. 람다(Lamda)  (0) 2021.04.02
[자바]4.제네릭(Generic)  (0) 2021.03.29
[자바]3. 날짜 출력 Date  (0) 2021.03.23