자바8, 함수형인터페이스, Consumer, Function, Predicate, Supplier(자바/JAVA/자바강좌/자바동영상/자바강의/JAVA강의/JAVA동영상/JAVA교육/자바교육/자바학원)
http://ojc.asia/bbs/board.php?bo_table=LecJava&wr_id=773


자바8, 함수형인터페이스, Consumer, Function, Predicate, Supplier(자바/JAVA/자바강좌/자바동영상/자바강의/JAVA강의/JAVA동영상/JAVA교육/자바교육/자바학원)
1. 함수형 인터페이스(Functional Interface)
추상메소드가 하나뿐인 인터페이스를 Functional Interface라고 한다.
자바8 부터는 람다식을 사용하여 함수형 인터페이스의 인스턴스를 나타낼 수 있다.
함수형 인터페이스에는 여러 개의 default 메서드가 있을 수 있다.
함수형 인터페이스의 인스턴스를 생성하기 위해 익명 클래스 등을 주로 사용했지만 람다식을 이용하면 편하다.
자바8에서 추가된 @FunctionalInterface 어노테이션은 함수형 인터페이스 임을 나타낸다.
Runnable, ActionListener, Comparable은 함수형 인터페이스 이며 자바8 이전에는 익명 클래스의 객체를 생성하거나 이러한 인터페이스를 구현해야 했지만 람다식을 이용하여 편리하게 구현할 수 있다.
Runnable 인터페이스의 인스턴스를 람다식을 이용하여 아래처럼 얻을 수 있다.
Runnable r = () -> System.out.println("oraclejava community");
쓰레드를 생성할 때 람다식을 이용할 수 있다.
new Thread( () -> System.out.println(“oraclejavacommunity”) )
[예제]
@FunctionalInterface
interface Worker {
public void work();
}
public class FITest {
static void execute(Worker worker) {
worker.work();
}
public static void main(String[] args) {
execute(new Worker() {
public void work() {
System.out.println("Hello~ 오라클자바커뮤니티");
}
});
execute( ()->System.out.println("Hello~ oraclejava community"));
}
}
2. java.util.function 패키지
함수형 인터페이스
java.util.function 패키지에는 몇가지 미리 정의된 함수형 인터페이스가 있다
Predicate: 하나의 매개변수를 주는 boolean형을 반환하는 test 메소드가 있다.
public interface Predicate<T> { boolean test(T t); }
Predicate<String> p = str -> str.isEmpty();
Boolean b = p.test(“ojc.asia”); //false
Consumer: 하나의 매개변수를 주는 void 형 accept 메소드가 있다.
public interface Consumer<T> { void accept(T t); }
Consumer<String> c = (s) -> System.out.println(s);
c.accept(“ojc.asia”); //ojc.asia
Function: T 유형의 인수를 취하고 R 유형의 결과를 반환하는 추상 메소드 apply가 있다.
public interface Function<T, R> { R apply(T t); }
Function<String, boolean> f = s -> s.isEmpty();
boolean b = f.apply(“ojc.asia”); //false
Supplier: 메소드 인자는 없고 T 유형의 결과를 반환하는 추상 메소드 get이 있다.
public interface Supplier<T> { T get(); }
Supplier<String> s = () -> “ojc.asia”;
String res = s.get(); //ojc.asia
UnaryOperator: 하나의 인자와 리턴타입을 가진다. T -> T
UnaryOperator<String> u = (s) -> “hello~ “ + s;
System.out.println(u.apply(“ojc.asia”)); //hello~ ojc.asia
//두 개의 인수, 동일한 타입의 결과를 반환하는 추상 메서드 apply가 있다.
BinaryOperator: A binary operator from (T, T) -> T
BinaryOperator bo = (s1, s2) -> s1 +”, ” + s2;
System.out.println(bo.apply(“Hello~”, “ojc.asia”));
3. 실습
package javatest;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
public class FITest2 {
public static void main(String[] args) {
List<String> cities = Arrays.asList("SEOUL","BUSAN","DAEGU","GWANGJU","JUNJU");
//하나의 매개변수를 주는 boolean형을 반환하는 test 메소드가 있다.
Predicate<String> p = (s)->s.startsWith("S");
for(String s: cities) {
if (p.test(s)) {
System.out.println("1. Predicate : S로 시작..." + s);
}
}
//하나의 매개변수를 주는 void 형 accept 메소드가 있다.
Consumer c = (s) -> {
if (s.toString().startsWith("S"))
System.out.println("2. Consumer : S로 시작..." + s);
};
cities.forEach(c);
//메소드 인자는 없고 T 유형의 결과를 반환하는 추상 메소드 get이 있다.
Supplier<String> s = () -> cities.toString();
System.out.println("3. Supplier : " + s.get());
//T 유형의 인수를 취하고 R 유형의 결과를 반환하는 추상 메소드 apply가 있다.
Function<String, Boolean> f = str -> str.startsWith("S");
for(String str: cities) {
if (f.apply(str)) {
System.out.println("4. Function : S로 시작..." + str);
}
}
}
}
1. Predicate : S로 시작...SEOUL
2. Consumer : S로 시작...SEOUL
3. Supplier : [SEOUL, BUSAN, DAEGU, GWANGJU, JUNJU]
4. Function : S로 시작...SEOUL

#자바함수형인터페이스, #함수형인터페이스, #자바Consumer, #자바Predicate, #자바Function, #자바Lambda,#람다식, #자바8, #자바8람다,#자바,#JAVA,#자바동영상,#자바강의,#자바교육,#자바강좌,#자바동영상강의,#추천자바강의,#추천자바강좌,#JAVA동영상,#JAVA강의,#JAVA강좌,#JAVA교육,#JAVA,#추천JAVA강의,#추천JAVA교육,#추천JAVA강좌,#자바소스,#자바온라인교육,#자바온라인강의
댓글 없음:
댓글 쓰기