四大函数式接口

java8 四大内置核心函数式接口

转载自:https://www.cnblogs.com/wuyx/p/9000312.html

image

其他补充接口:

image

一、Consumer<T>:消费型接口(void accept(T t))

来看一个简单得例子:

1    /**

2      * 消费型接口Consumer<T>

3      */

4    @Test

5    public void test1 () {

6        consumo(500, (x) -> System.out.println(x));

7    }

8   

9    public void consumo (double money, Consumer<Double> c) {

10        c.accept(money);

11    }

  以上为消费型接口,有参数,无返回值类型的接口。

* * *

二、Supplier<T>:供给型接口(T get())

来看一个简单得例子:

1    /**

2      * 供给型接口,Supplier<T>

3      */

4    @Test

5    public void test2 () {

6        Random ran = new Random();

7        List<Integer> list = supplier(10, () -> ran.nextInt(10));

8       

9        for (Integer i : list) {

10            System.out.println(i);

11        }

12    }

13   

14    /**

15      * 随机产生sum个数量得集合

16      * @param sum 集合内元素个数

17      * @param sup

18      * @return

19      */

20    public List<Integer> supplier(int sum, Supplier<Integer> sup){

21        List<Integer> list = new ArrayList<Integer>();

22        for (int i = 0; i < sum; i++) {

23            list.add(sup.get());

24        }

25        return list;

26    }

上面就是一个供给类型得接口,只有产出,没人输入,就是只有返回值,没有入参


三、Function<T, R>:函数型接口(R apply(T t))

下面看一个简单的例子:

1 /**

2 * 函数型接口:Function<R, T>

3 */

4    @Test

5    public void test3 () {

6        String s = strOperar(" asdf ", x -> x.substring(0, 2));

7        System.out.println(s);

8        String s1 = strOperar(" asdf ", x -> x.trim());

9        System.out.println(s1);

10    }

11   

12    /**

13      * 字符串操作

14      * @param str 需要处理得字符串

15      * @param fun Function接口

16      * @return 处理之后得字符传

17      */

18    public String strOperar(String str, Function<String, String> fun) {

19        return fun.apply(str);

20    }

上面就是一个函数型接口,输入一个类型得参数,输出一个类型得参数,当然两种类型可以一致。


四、Predicate<T>:断言型接口(boolean test(T t))

下面看一个简单得例子:

1    /**

2      * 断言型接口:Predicate<T>

3      */

4    @Test

5    public void test4 () {

6        List<Integer> l = new ArrayList<>();

7        l.add(102);

8        l.add(172);

9        l.add(13);

10        l.add(82);

11        l.add(109);

12        List<Integer> list = filterInt(l, x -> (x > 100));

13        for (Integer integer : list) {

14            System.out.println(integer);

15        }

16    }

17   

18    /**

19      * 过滤集合

20      * @param list

21      * @param pre

22      * @return

23      */

24    public List<Integer> filterInt(List<Integer> list, Predicate<Integer> pre){

25        List<Integer> l = new ArrayList<>();

26        for (Integer integer : list) {

27            if (pre.test(integer))

28                l.add(integer);

29        }

30        return l;

31    }

上面就是一个断言型接口,输入一个参数,输出一个boolean类型得返回值。


五、其他类型的一些函数式接口

除了上述得4种类型得接口外还有其他的一些接口供我们使用:

1).BiFunction<T, U, R>

参数类型有2个,为T,U,返回值为R,其中方法为R apply(T t, U u)

2).UnaryOperator<T>(Function子接口)

参数为T,对参数为T的对象进行一元操作,并返回T类型结果,其中方法为T apply(T t)

3).BinaryOperator<T>(BiFunction子接口)

参数为T,对参数为T得对象进行二元操作,并返回T类型得结果,其中方法为T apply(T t1, T t2)

4).BiConsumcr(T, U)

参数为T,U无返回值,其中方法为 void accept(T t, U u)

5).ToIntFunction<T>、ToLongFunction<T>、ToDoubleFunction<T>

参数类型为T,返回值分别为int,long,double,分别计算int,long,double得函数。

6).IntFunction<R>、LongFunction<R>、DoubleFunction<R>

参数分别为int,long,double,返回值为R。

以上就是java8内置得核心函数式接口,其中包括了大部分得方法类型,所以可以在使用得时候根据不同得使用场景去选择不同得接口使用


函数式接口可以对现有的函数友好地支持 lambda。

JDK 1.8 之前已有的函数式接口:

java.lang.Runnable
java.util.concurrent.Callable
java.security.PrivilegedAction
java.util.Comparator
java.io.FileFilter
java.nio.file.PathMatcher
java.lang.reflect.InvocationHandler
java.beans.PropertyChangeListener
java.awt.event.ActionListener
javax.swing.event.ChangeListener
JDK 1.8 新增加的函数接口:

java.util.function
java.util.function 它包含了很多类,用来支持 Java的 函数式编程,该包中的函数式接口有:

序号 接口 & 描述
1 BiConsumer<T,U>
代表了一个接受两个输入参数的操作,并且不返回任何结果

2 BiFunction<T,U,R>
代表了一个接受两个输入参数的方法,并且返回一个结果

3 BinaryOperator<T>
代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果

4 BiPredicate<T,U>
代表了一个两个参数的boolean值方法

5 BooleanSupplier
代表了boolean值结果的提供方

6 Consumer<T>
代表了接受一个输入参数并且无返回的操作

7 DoubleBinaryOperator
代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。

8 DoubleConsumer
代表一个接受double值参数的操作,并且不返回结果。

9 DoubleFunction<R>
代表接受一个double值参数的方法,并且返回结果

10 DoublePredicate
代表一个拥有double值参数的boolean值方法

11 DoubleSupplier
代表一个double值结构的提供方

12 DoubleToIntFunction
接受一个double类型输入,返回一个int类型结果。

13 DoubleToLongFunction
接受一个double类型输入,返回一个long类型结果

14 DoubleUnaryOperator
接受一个参数同为类型double,返回值类型也为double 。

15 Function<T,R>
接受一个输入参数,返回一个结果。

16 IntBinaryOperator
接受两个参数同为类型int,返回值类型也为int 。

17 IntConsumer
接受一个int类型的输入参数,无返回值 。

18 IntFunction<R>
接受一个int类型输入参数,返回一个结果 。

19 IntPredicate
:接受一个int输入参数,返回一个布尔值的结果。

20 IntSupplier
无参数,返回一个int类型结果。

21 IntToDoubleFunction
接受一个int类型输入,返回一个double类型结果 。

22 IntToLongFunction
接受一个int类型输入,返回一个long类型结果。

23 IntUnaryOperator
接受一个参数同为类型int,返回值类型也为int 。

24 LongBinaryOperator
接受两个参数同为类型long,返回值类型也为long。

25 LongConsumer
接受一个long类型的输入参数,无返回值。

26 LongFunction<R>
接受一个long类型输入参数,返回一个结果。

27 LongPredicate
R接受一个long输入参数,返回一个布尔值类型结果。

28 LongSupplier
无参数,返回一个结果long类型的值。

29 LongToDoubleFunction
接受一个long类型输入,返回一个double类型结果。

30 LongToIntFunction
接受一个long类型输入,返回一个int类型结果。

31 LongUnaryOperator
接受一个参数同为类型long,返回值类型也为long。

32 ObjDoubleConsumer<T>
接受一个object类型和一个double类型的输入参数,无返回值。

33 ObjIntConsumer<T>
接受一个object类型和一个int类型的输入参数,无返回值。

34 ObjLongConsumer<T>
接受一个object类型和一个long类型的输入参数,无返回值。

35 Predicate<T>
接受一个输入参数,返回一个布尔值结果。

36 Supplier<T>
无参数,返回一个结果。

37 ToDoubleBiFunction<T,U>
接受两个输入参数,返回一个double类型结果

38 ToDoubleFunction<T>
接受一个输入参数,返回一个double类型结果

39 ToIntBiFunction<T,U>
接受两个输入参数,返回一个int类型结果。

40 ToIntFunction<T>
接受一个输入参数,返回一个int类型结果。

41 ToLongBiFunction<T,U>
接受两个输入参数,返回一个long类型结果。

42 ToLongFunction<T>
接受一个输入参数,返回一个long类型结果。

43 UnaryOperator<T>
接受一个参数为类型T,返回值类型也为T。

函数式接口实例
Predicate <T> 接口是一个函数式接口,它接受一个输入参数 T,返回一个布尔值结果。

该接口包含多种默认方法来将Predicate组合成其他复杂的逻辑(比如:与,或,非)。

该接口用于测试对象是 true 或 false。

我们可以通过以下实例(Java8Tester.java)来了解函数式接口 Predicate <T> 的使用:

Java8Tester.java 文件
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

public class Java8Tester {
public static void main(String args[]){
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);

  // Predicate<Integer> predicate = n -> true
  // n 是一个参数传递到 Predicate 接口的 test 方法
  // n 如果存在则 test 方法返回 true
    
  System.out.println("输出所有数据:");
    
  // 传递参数 n
  eval(list, n->true);
    
  // Predicate<Integer> predicate1 = n -> n%2 == 0
  // n 是一个参数传递到 Predicate 接口的 test 方法
  // 如果 n%2 为 0 test 方法返回 true
    
  System.out.println("输出所有偶数:");
  eval(list, n-> n%2 == 0 );
    
  // Predicate<Integer> predicate2 = n -> n > 3
  // n 是一个参数传递到 Predicate 接口的 test 方法
  // 如果 n 大于 3 test 方法返回 true
    
  System.out.println("输出大于 3 的所有数字:");
  eval(list, n-> n > 3 );

}

public static void eval(List<Integer> list, Predicate<Integer> predicate) {
for(Integer n: list) {

     if(predicate.test(n)) {
        System.out.println(n + " ");
     }
  }

}
}
执行以上脚本,输出结果为:

javac Java8Tester.java java Java8Tester
输出所有数据:
1
2
3
4
5
6
7
8
9
输出所有偶数:
2
4
6
8
输出大于 3 的所有数字:
4
5
6
7
8
9

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351