首页 > 编程语言 > 详细

Java函数式接口

时间:2019-06-27 12:31:00      阅读:104      评论:0      收藏:0      [点我收藏+]
函数式接口定义且只定义了一个抽象方法.函数式接口的抽象方法的签名称为函数描述符
Java 8的java.util.function包中引入了几个新的函数式接口。

1.Predicate

java.util.function.Predicate<T>接口定义了一个名叫 test 的抽象方法,它接受泛型T对象,并返回一个 boolean 。
这恰恰和你先前创建的一样,现在就可以直接使用了。在你需要表示一个涉及类型  T的布尔表达式时,就可以使用这个接口。
比如,你可以定义一个接受 String对象的 Lambda表达式,如下所示。

@FunctionalInterface
public interface Predicate<T>{
    boolean test(T t);
}
public static <T> List<T> filter(List<T> list, Predicate<T> p) {
    List<T> results = new ArrayList<>();
    for(T s: list){
        if(p.test(s)){
            results.add(s);
        }
    }
    return results;
}
Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
List<String> nonEmpty = filter(listOfStrings, nonEmptyStringPredicate);

2.Consumer

 java.util.function.Consumer<T> 定义了一个名叫 accept 的抽象方法,它接受泛型 T的对象,没有返回(void)
你如果需要访问类型  T的对象,并对其执行某些操作,就可以使用这个接口。比如,你可以用它来创建一个 forEach 方法,
接受一个 Integers的列表,并对其中每个元素执行操作。在下面的代码中,你就可以使用这个forEach方法,并配合 Lambda来打印列表中的所有元素。

@FunctionalInterface
public interface Consumer<T>{
    void accept(T t);
}
public static <T> void forEach(List<T> list, Consumer<T> c){
    for(T i: list){
        c.accept(i);
    }
}
forEach(Arrays.asList(1,2,3,4,5),(Integer i) -> System.out.println(i));

3.Function

 java.util.function.Function<T, R>接口定义了一个叫作 apply的方法,它接受一个泛型T的对象,并返回一个泛型R的对象。
如果你需要定义一个 Lambda ,将输入对象的信息映射到输出,就可以使用这个接口(比如提取苹果的重量,或把字符串映射为它的长度)。
在下面的代码中,我们向你展示如何利用它来创建一个map方法,以将一个String列表映射到包含每个String长度的Integer列表。

@FunctionalInterface
public interface Function<T, R>{
    R apply(T t);
}
public static <T, R> List<R> map(List<T> list,
Function<T, R> f) {
    List<R> result = new ArrayList<>();
    for(T s: list){
        result.add(f.apply(s));
    }
    return result;
}
// [7, 2, 6]
List<Integer> l = map(Arrays.asList("lambdas","in","action"),(String s) -> s.length());

Java函数式接口

原文:https://www.cnblogs.com/Java-Script/p/11096120.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!