자바 함수 식 인 터 페 이 스 를 어떻게 능숙 하 게 사용 하 는 지 상세 하 게 설명 하 다.
Lambda 표현 식 을 사용 하 는 전 제 는 함수 식 인터페이스 가 필요 하 다 는 것 을 알 고 있 습 니 다.Lambda 표현 식 을 사용 할 때 인터페이스 이름,추상 적 인 방법 이름 에 관심 이 없습니다.추상 적 인 방법의 매개 변수 목록 과 반환 값 형식 에 만 관심 을 가 집 니 다.따라서 Lambda 표현 식 을 사용 할 수 있 도록 JDK 에서 자주 사용 하 는 함수 식 인 터 페 이 스 를 많이 제공 합 니 다.
package com.bobo.jdk.fun;
public class Demo01Fun {
public static void main(String[] args) {
fun1((arr)->{
int sum = 0 ;
for (int i : arr) {
sum += i;
}
return sum;
});
}
public static void fun1(Operator operator){
int[] arr = {1,2,3,4};
int sum = operator.getSum(arr);
System.out.println("sum = " + sum);
}
}
/**
*
*/
@FunctionalInterface
interface Operator{
int getSum(int[] arr);
}
2.함수 식 인터페이스 소개JDK 에서 제공 하 는 함수 식 인 터 페 이 스 는 주로 자바 util.function 패키지 에 있 습 니 다.
2.1 Supplier
반환 값 이 있 는 인터페이스 가 없습니다.Lambda 표현 식 은 데 이 터 를 되 돌려 주 는 형식 을 제공 해 야 합 니 다.
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
사용:
/**
* Supplier
*/
public class SupplierTest {
public static void main(String[] args) {
fun1(()->{
int arr[] = {22,33,55,66,44,99,10};
//
Arrays.sort(arr);
return arr[arr.length-1];
});
}
private static void fun1(Supplier<Integer> supplier){
// get()
Integer max = supplier.get();
System.out.println("max = " + max);
}
}
2.2 Consumer인터페이스 에 되 돌아 갈 가치 가 있 는 지 없 는 지,앞에서 소개 한 Supplier 인 터 페 이 스 는 데 이 터 를 생산 하 는 데 사용 되 며,Consumer 인 터 페 이 스 는 데 이 터 를 소비 하 는 데 사용 되 므 로 사용 할 때 범 형 을 지정 하여 매개 변수 유형 을 정의 해 야 합 니 다.
@FunctionalInterface
public interface Consumer<T> {
/**
* Performs this operation on the given argument.
*
* @param t the input argument
*/
void accept(T t);
}
사용:입력 한 데 이 터 를 소문 자 출력 으로 통일 합 니 다.
public class ConsumerTest {
public static void main(String[] args) {
test(msg -> {
System.out.println(msg + "-> :" + msg.toLowerCase());
});
}
public static void test(Consumer<String> consumer){
consumer.accept("Hello World");
}
}
기본 방법:andThen만약 에 한 방법의 매개 변수 와 반환 값 이 모두 Consumer 유형 이 라면 효 과 를 실현 할 수 있 습 니 다.한 데 이 터 를 소비 할 때 먼저 조작 을 한 다음 에 하나의 조작 을 해서 조합 을 실현 합 니 다.이 방법 은 바로 Consumer 인터페이스의 default 방법 앤 드 Then 방법 입 니 다.
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
구체 적 인 조작
public class ConsumerAndThenTest {
public static void main(String[] args) {
test2(msg1->{
System.out.println(msg1 + "-> :" + msg1.toLowerCase());
},msg2->{
System.out.println(msg2 + "-> :" + msg2.toUpperCase());
});
}
public static void test2(Consumer<String> c1,Consumer<String> c2){
String str = "Hello World";
//c1.accept(str); //
//c2.accept(str); //
//c1.andThen(c2).accept(str);
c2.andThen(c1).accept(str);
}
}
2.3 Function반환 값 이 있 는 인터페이스 가 있 습 니 다.Function 인 터 페 이 스 는 한 유형의 데이터 에 따라 다른 유형의 데 이 터 를 얻 는 것 입 니 다.전 자 는 선행 조건 이 라 고 하고 후 자 는 사후 조건 이 라 고 합 니 다.매개 변수 가 있 고 반환 값 이 있 습 니 다.
@FunctionalInterface
public interface Function<T, R> {
/**
* Applies this function to the given argument.
*
* @param t the function argument
* @return the function result
*/
R apply(T t);
}
사용:문자열 에 들 어가 숫자 를 되 돌려 줍 니 다.
public class FunctionTest {
public static void main(String[] args) {
test(msg ->{
return Integer.parseInt(msg);
});
}
public static void test(Function<String,Integer> function){
Integer apply = function.apply("666");
System.out.println("apply = " + apply);
}
}
기본 방법:and Then 도 조합 작업 을 하 는 데 사 용 됩 니 다.
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
public class FunctionAndThenTest {
public static void main(String[] args) {
test(msg ->{
return Integer.parseInt(msg);
},msg2->{
return msg2 * 10;
});
}
public static void test(Function<String,Integer> f1,Function<Integer,Integer> f2){
/*Integer i1 = f1.apply("666");
Integer i2 = f2.apply(i1);*/
Integer i2 = f1.andThen(f2).apply("666");
System.out.println("i2:" + i2);
}
}
기본 compose 방법의 작용 순서 와 andThen 방법 은 정반 대 이다정적 방법 idenity 는 매개 변 수 를 입력 하면 매개 변 수 를 되 돌려 줍 니 다.
2.4 Predicate
참고 및 반환 값 이 Boolean 인 인터페이스 가 있 습 니 다.
@FunctionalInterface
public interface Predicate<T> {
/**
* Evaluates this predicate on the given argument.
*
* @param t the input argument
* @return {@code true} if the input argument matches the predicate,
* otherwise {@code false}
*/
boolean test(T t);
}
사용:
public class PredicateTest {
public static void main(String[] args) {
test(msg -> {
return msg.length() > 3;
},"HelloWorld");
}
private static void test(Predicate<String> predicate,String msg){
boolean b = predicate.test(msg);
System.out.println("b:" + b);
}
}
Predicate 의 기본 방법 은 논리 적 관계 조작 and or negate isequals 방법 을 제공 합 니 다.
package com.bobo.jdk.fun;
import java.util.function.Predicate;
public class PredicateDefaultTest {
public static void main(String[] args) {
test(msg1 -> {
return msg1.contains("H");
},msg2 -> {
return msg2.contains("W");
});
}
private static void test(Predicate<String> p1,Predicate<String> p2){
/*boolean b1 = predicate.test(msg);
boolean b2 = predicate.test("Hello");*/
// b1 H b2 W
// p1 H p2 W
boolean bb1 = p1.and(p2).test("Hello");
// p1 H p2 W
boolean bb2 = p1.or(p2).test("Hello");
// p1 H
boolean bb3 = p1.negate().test("Hello");
System.out.println(bb1); // FALSE
System.out.println(bb2); // TRUE
System.out.println(bb3); // FALSE
}
}
자바 함수 식 인 터 페 이 스 를 어떻게 능숙 하 게 사용 하 는 지 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 함수 식 인터페이스 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.