본문 바로가기

JAVA

표준 API 함수적 인터페이스

//표준 API 함수적 인터페이스

 -JDK1.8

 -java.util.function

 -함수적 인터페이스 집합 패키지. 오로지 람다식만을 지원하기 위해 만들어진 인터페이스 모음

 - 람다식 타겟 타입 = 표준 API 함수적 인터페이스 + 사용자 정의 함수적 인터페이스

//표준 API 함수적 인터페이스 종류

 -추상메소드 딱1개

 1.Consumer : 매개변수 O, 반환값 X -> 추상메소드 제공 

 2.Supplier  : 매개변수 x, 반환값 O 

 3.Function  : 매개변수 O, 반환값 O, 주로 매개변수를 반환값 타입으로 반환 후 반환역할

 4.Operator  : 매개변수 O, 반환값 O, 주로 매개변수를 연산 후 결과값 반환 역할

 5.Predicate  : 매개변수 O, 반환값 O, 주로 매개변수를 조사 후 논리값 반환 역할


---------------------------------------------------------------------------------------------------------


//Consumer

- accept() 메소드를 제공하는 함수형 인터페이스

- 매개변수를 받아서 소비하는 일을 구현하는 역할

- 다양한 오버로딩 지원


Consumer<String> c = (String txt) ->{System.out.println("결과 : " + txt);};

c.accept("아무개");


====> 결과 + 아무개


//Consumer 인터페이스 -> 추상메소드 -> 인자값 1개 -> 소비메소드 구현부? 전달된 매개변수를 어떤 식으로 사용하는 지는 제한 없음(구현하는 사람 마음대로~);


Consumer<Integer> c2 = (int count) -> {

for(int i=0;i<count;i++){

System.out.print(i+ "\t");

}

};

c2.accept(10);


===> 1 2 3 4 5 6 7 8 9 


//Consumer의 종류

1.Consumer

2.BioConsumer

3.IntConsumer

4.DoubleConsumer

5.ObjConsumer

---------------------------------------------------------------------------------------------------------


//Supplier

- getXXX() 메소드를 제공하는 함수형 인터페이스

- 데이터를 공급하는 역할을 한다.


Supplier<T>

인자는 받지않으며 리턴타입만 존재하는 메서드를 갖고있다. 순수함수에서 결과를 바꾸는건 오직 인풋(input) 뿐이다. 

그런데 인풋이 없다는건 내부에서 랜덤함수같은것을 쓰는게 아닌이상 항상 같은 것을 리턴하는 메서드라는걸 알 수 있다.


예제)

//User 클래스

class User{

private String name;

private int age;

public User() {};

public User(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {


return String.format("%s(%s)", this.name,this.age);

}

}


Supplier<Integer> s1 = () -> 100;

System.out.println(s1.get());


Supplier<String> s2 = () -> "문자열";

System.out.println(s2.get());


Supplier<User> s3 = () -> new User("아무개",20);


User u = s3.get();

System.out.println(u); ==>아무개(20)


//public List<User> get() {return 배열;}

Supplier<List<User>>s4 = () ->{

List<User> list = new ArrayList<User>();

list.add(new User("아무개",20));

list.add(new User("홍길동",22));

list.add(new User("테스트",23));

return list;

};

for(User user : s4.get()) {

System.out.println(user);

}


Supplier<Map<String,User>> s5 = () -> {

Map<String,User> map = new HashMap<String,User>();

map.put("반장", new User("홍길동",20));

map.put("부반장", new User("아무개",21));

map.put("체육부장", new User("호호호",22));

return map;

};

//Map 형태

Map<String,User> map = s5.get();


System.out.println(map.get("반장"));

System.out.println(map.get("부반장"));

System.out.println(map.get("체육부장"));



Supplier<List<Map<String,User>>> s6 = () ->{

List<Map<String,User>> list = new ArrayList<Map<String,User>>();

Map<String,User> map1 = new HashMap<String,User>();

map1.put("아빠", new User("홍길동",30));

map1.put("엄마", new User("호호호",30));

list.add(map1);

Map<String,User> map2 = new HashMap<String,User>();

map2.put("아빠", new User("아무개",35));

map2.put("엄마", new User("헤헤헤",32));

map2.put("아이", new User("아아아",8));

list.add(map2);

return list;

};

List<Map<String,User>> list = s6.get();

for(Map<String,User> m : list) {

//각세대별로 루프(m)

Set<String> keys = m.keySet();

Iterator<String> iter = keys.iterator();

while(iter.hasNext()) { //1사람

String key = iter.next();

System.out.println(key + " : " + m.get(key).getName());

}

System.out.println();

}




---------------------------------------------------------------------------------------------------------

//함수형 인터페이스

- 람다식을 저장하는 용도(내부적으로는 람다식으로 만들어진 메소드를 소유한 익명 객체를 생성)


//Function (값 -> 값 반환)

- 매개변수와 반환값이 있는 메소드를 제공한다.

- applyXXX() 메소드를 제공하는 함수형 인터페이스

- 매개값을 반환값으로 매핑(변환)하는 역할


예제)

Function<String, Integer> f1 = (txt) -> txt.length();

System.out.println(f1.apply("홍길동입니다.")); // apply("문자") -> 반환값 = 글자수

Function<Integer, String> f2 = num -> num >0 ? "양수" : "음수" ;

System.out.println(f2.apply(2));

Function<Mouse,Integer> f3 = m -> (int)(m.getPrice()*1.1);

System.out.println(f3.apply(new Mouse("마우스",20000)));

Function<Student,Integer> f4 = s -> s.getKor()+s.getEng()+s.getMath();

System.out.println(f4.apply(new Student("홍길동",100,90,80)));


---------------------------------------------------------------------------------------------------------


//Operator(연산자)

- 매개변수와 반환값이 있는 메소드를 제공한다.

- applyXXX()

- Function의 하위 호환 인터페이스(서브셋)

- 주로 매개값을 연산(****)을 통해 결과값을 만들어내고 그 값을 반환

- Function과 큰 차이는 Operator는 매개값을 반환값의 타입 동일


예제)

BinaryOperator<Integer> b1 = (n1,n2) -> n1+n2; // 반환값,매개값,전부 Integer

System.out.println(b1.apply(10, 20));

BinaryOperator<String> b2 = (firstName,lastName) -> lastName+firstName;

System.out.println(b2.apply("길동", "홍"));


---------------------------------------------------------------------------------------------------------


//Predicate

- 매개변수와 반환값이 있는 메소드를 제공한다.

- testXXX()

- 매개값을 사용해 조사(조건) 후 논리값을 반환한다.

- Function 서브셋


예제)

Predicate<Integer> p1 =n -> n>0;

System.out.println(p1.test(10));

Predicate<String> p2 = s ->s.length()>10;

if(p2.test("홍길동입니다")) {

System.out.println("긴문장");

}else {

System.out.println("짧은 문장");

}

Predicate<Student> p3 = s -> (s.getKor()+s.getEng()+s.getMath())>240;

if(p3.test(new Student("홍길동",100,90,80))) {

System.out.println("합격");

}else {

System.out.println("불합격");

}

BiPredicate<String, String> p4 = (s1,s2) -> s1.length()>s2.length();

if(p4.test("홍길동", "홍민")) {

System.out.println("긴문장");

}else {

System.out.println("짧은 문장");

}



출처: http://multifrontgarden.tistory.com/125 [우리집앞마당]



'JAVA' 카테고리의 다른 글

인터페이스를 합치는 작업(andThen,compose)  (0) 2018.08.10
람다식,Lambda Expressions 개념및 예제  (0) 2018.08.09
문자열분리(Splitter, Delimiter)  (0) 2018.08.09
Collection 정리  (0) 2018.08.08
Treemap  (0) 2018.08.08