这几个接口经常与Lambda结合使用,网上当然也有很多介绍,不过有些过于繁琐,有些又偏简单,秉着实用主义精神,今天这里折中一下,把介绍的内容分为两部分,第一部分相当于TLDR,总结几个“口诀”,便于大家记忆,对于更想看用法示例的同学们,第二部分者提供了所有这些接口的示例。希望对大家有所帮助。

口诀

    如无参数,请使用Supplier(Use Supplier if it takes nothing)

    如无返回,请使用Consumer(Use Consumer if it returns nothing)

    如两者都无,请使用Runnable(Use Runnable if it does neither)

    如两者都有,请使用Function(Use Function if it does both)

    如返回布尔值,请使用Predicate(Use Predicate if it returns a boolean)

    如以上皆不可以,请使用自定义@FunctionalInteface(Use @FunctionalInteface if none of above works)

示例

  1. Supplier
private static <T> T testSupplier(Supplier<T> supplier) {
    return supplier.get();
}
...
Integer s = testSupplier(() -> 7 + 3); // 不接受任何参数,但会返回数据
System.out.println(s); // 输出10
  1. Consumer
private static <T> void testConsumer(Consumer<T> consumer, T data) {
    consumer.accept(data);
}
...
testConsumer(System.out::println, "dummy"); // 直接调用println,输出"dummy",无任何返回
  1. Runnable
private static void testRunnable(Runnable runnable) {
    runnable.run();
}
...
testRunnable(() -> System.out.println("dummy")); // 既无输入,也无输出
  1. Function
private static <T, R> R testFunction(Function<T, R> function, T data) {
    return function.apply(data);
}
...
Integer f = testFunction((d) -> d * 2, 3); // 既有输入,也有输出(将给定值X2)
System.out.println(f); // 输出6
  1. Predicate
private static <T> boolean testPredicate(Predicate<T> predicate, T data) {
    return predicate.test(data);
}
...
boolean p = testPredicate((d) -> d > 0, 100); // 接受输入,输出布尔值(判断给定值是否为正数)
System.out.println(p); // 输出true
  1. @FunctionalInterface
@FunctionalInterface
public interface CalculationFuncInterface<T, U, R> {
    public R apply(T l, U i);
}
...
private static <T, U, R> R testFunctionalInterface(CalculationFuncInterface<T, U, R> cal, T data1, U data2) {
    return cal.apply(data1, data2);
}
...
Integer fi = testFunctionalInterface((a, b) -> a * b, 6, 7); // 接受两个输入参数,并返回其乘积
System.out.println(fi); // 输出42

今天的介绍就先到这,感谢大家,Cheers!



公众号“程序员杂书馆”,欢迎关注。免费送出O'Reilly《Spark快速大数据分析》纸质书(亦有一批PDF分享)!

Java Lambda基础——Function, Consumer, Predicate, Supplier, 及FunctionalInterface接口的更多相关文章

  1. java8 array、list操作 汇【2】)- (Function,Consumer,Predicate,Supplier)应用

    static class UserT { String name; public UserT(String zm) { this.name=zm; } public String getName() ...

  2. Java8 (Function,Consumer,Predicate,Supplier)详解

    1. https://blog.csdn.net/lzm18064126848/article/details/70199769 1.1 https://blog.csdn.net/turbo_zon ...

  3. Java—Lambda基础

    虽然JVM有着Scala .Groovy .Clojure 等依赖于JVM的函数语式语言,但直到Java8才算是java正式支持函数式编程: Java8中加入了Lambda的支持标志着Java正式加入 ...

  4. 函数式接口的使用 (Function、Predicate、Supplier、Consumer)

    参考:https://blog.csdn.net/jmj18756235518/article/details/81490966 函数式接口 定义:有且只有一个抽象方法的接口 Function< ...

  5. java代码之美(15)---Java8 Function、Consumer、Supplier

    Java8 Function.Consumer.Supplier 有关JDK8新特性之前写了三篇博客: 1.java代码之美(1)---Java8 Lambda 2.java代码之美(2)---Jav ...

  6. java代码(15) ---java8 Function 、Consumer 、Supplier

    Java8 Function.Consumer.Supplier 有关JDK8新特性之前还有三篇博客: 1,java代码(1)---Java8 Lambda 2,java代码(2)---Java8 S ...

  7. Java 8 基础教程 - Predicate

    在Java 8中,Predicate是一个函数式接口,可以被应用于lambda表达式和方法引用.其抽象方法非常简单: /** * Evaluates this predicate on the giv ...

  8. 30 分钟 Java Lambda 入门教程

    Lambda简介 Lambda作为函数式编程中的基础部分,在其他编程语言(例如:Scala)中早就广为使用,但在Java领域中发展较慢,直到java8,才开始支持Lambda. 抛开数学定义不看,直接 ...

  9. Java Lambda表达

    Java 8 lambda表达式示例 我个人对Java 8发布非常激动,尤其是lambda表达式和流API.越来越多的了解它们,我能写出更干净的代码.虽然一开始并不是这样.第一次看到用lambda表达 ...

随机推荐

  1. 【python】mongo删除数据

    参考:https://stackoverflow.com/questions/23334743/setting-justone-limiter-for-pymongo-remove-throws-ty ...

  2. Git使用二:git与svn的区别与工作流程

    svn记录的是每一次版本变动的内容,三角形代表改动的内容 git是将每个版本独立保存 git的三棵树:工作区域.暂存区域.git仓库 工作目录:平时存放项目的地方暂存区域:临时存放改动,即将提交到仓库 ...

  3. python selenium打开新窗口,多窗口切换

    # coding=utf-8 from selenium import webdriver browser=webdriver.Firefox() browser.maximize_window() ...

  4. Lottie 动画

    #### 三方框架之Lotti使用Lottie 的使用 1.添加 Gradle 依赖 dependencies { compile 'com.airbnb.android:lottie:1.5.3'} ...

  5. Android常用框架和控件使用

    Router框架 https://github.com/iqiyi/Andromeda/blob/master/CHINESE_README.md https://github.com/alibaba ...

  6. idea格式化代码无效Ctrl+Alt+L

    1.Idea格式化代码,无效,我的原因是热键冲突,我按Ctrl+Alt+L的时候,竟然弹出了锁QQ,果断关了QQ的热键,百度有的是网易啥的,具体情况具体分析吧.

  7. Java集合源码学习(二)ArrayList

    1.关于ArrayList ArrayList直接继承AbstractList,实现了List. RandomAccess.Cloneable.Serializable接口,为什么叫"Arr ...

  8. Java第三阶段学习(七、线程池、多线程)

    一.线程池 1.概念: 线程池,其实就是一个容纳多个线程的容器,其中的线程可以重复使用,省去了频繁创建线程对象的过程,无需反复创建线程而消耗过多资源,是JDK1.5以后出现的. 2.使用线程池的方式- ...

  9. UIImageView的常用方法

    //初始化 init(image: UIImage!) @availability(iOS, introduced=3.0)//初始化,highlightedImage 高亮图片 init(image ...

  10. 设置sde表空间为自动增长

    有的用户在测试数据时,希望在SDE表空间里面不受限制地导入数据,于是需要将SDE的表空间设置为自动增长. 过程描述 1.可以在创建sde表空间的时候,添加参数Autoextend on,修改后创建命令 ...