Java 没有委托的概念; 相反,如果需要一个指向函数的指针,可以创建内联匿名类(或 Java 8 的 lambda 表达式),它们是为此建议设计的某些接口的实现(也称为 Java 8 的功能接口)。 然而,随着 Java 的发展,越来越多的此类接口被添加进来。 虽然它们看起来非常相似且令人困惑,但它们中的每一个都有一个独特的特征,使其与众不同。 可以将它们中的许多映射到 .NET 中的相同类型。 下表列出了一些著名的接口,但还有更多。 例如,为了支持带有两个参数的函数,Java 有另一个接口称为 BiFunction,如果您需要更多参数,则必须创建自己的接口。 请记住,如果唯一的区别是类型参数的数量,Java(最高版本 10)不支持相同的类名。 (在 .NET 中有各种 Func 和 Action 类型,最多有 16 个类型参数。)

Supplier () -> x
Consumer x -> ()
Callable () -> x throws ex
Runnable () -> ()
Function x -> y


Runnable


Since Java’s early days, multithreading has been a major aspect of the
language. Runnable is the core interface provided for representing
multithreaded tasks, and Java 1.5 provided Callable as an improved
version of Runnable.

Runnable 接口是一个函数式接口,有一个不接受任何参数或返回任何值的 run() 方法。
这适用于我们不寻找线程执行结果的情况,例如传入事件日志记录:

public interface Runnable {public void run();
}
public class EventLoggingTask implements  Runnable{private Logger logger= LoggerFactory.getLogger(EventLoggingTask.class);@Overridepublic void run() {logger.info("Message");}
}

在此示例中,线程将仅从队列中读取消息并将其记录在日志文件中。任务没有返回任何值。 我们可以使用 ExecutorService 启动任务:

public void executeTask() {executorService = Executors.newSingleThreadExecutor();Future future = executorService.submit(new EventLoggingTask());executorService.shutdown();
}

Callable


Callable 接口是一个通用接口,包含一个返回通用值 V 的 call() 方法:

public interface Callable<V> {V call() throws Exception;
}
public class FactorialTask implements Callable<Integer> {int number;// standard constructorspublic Integer call() throws InvalidParamaterException {int fact = 1;// ...for(int count = number; count > 1; count--) {fact = fact * count;}return fact;}
}
@Test
public void whenTaskSubmitted_ThenFutureResultObtained(){FactorialTask task = new FactorialTask(5);Future<Integer> future = executorService.submit(task);assertEquals(120, future.get().intValue());
}

Consumer


从字面意思上我们就可以看得出,consumer接口就是一个消费型的接口,通过传入参数,然后输出值
我们下面就先看一个例子

@Test
public void test_Consumer() {//① 使用consumer接口实现方法Consumer<String> consumer = new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}};Stream<String> stream = Stream.of("aaa", "bbb", "ddd", "ccc", "fff");stream.forEach(consumer);System.out.println("********************");//② 使用lambda表达式,forEach方法需要的就是一个Consumer接口stream = Stream.of("aaa", "bbb", "ddd", "ccc", "fff");Consumer<String> consumer1 = (s) -> System.out.println(s);//lambda表达式返回的就是一个Consumer接口stream.forEach(consumer1);//更直接的方式//stream.forEach((s) -> System.out.println(s));System.out.println("********************");//③ 使用方法引用,方法引用也是一个consumerstream = Stream.of("aaa", "bbb", "ddd", "ccc", "fff");Consumer consumer2 = System.out::println;stream.forEach(consumer);//更直接的方式//stream.forEach(System.out::println);
}

lambda 表达式作为 consumer

Consumer<String> consumer1 = (s) -> System.out.println(s);

方法引用作为 consumer

Consumer consumer2 = System.out::println;

Supplier


Supplier 接口是一个供给型的接口,其实,说白了就是一个容器,可以用来存储数据,然后可以供其他方法使用的这么一个接口。

@Test
public void test_Supplier() {//① 使用Supplier接口实现方法,只有一个get方法,无参数,返回一个值Supplier<Integer> supplier = new Supplier<Integer>() {@Overridepublic Integer get() {//返回一个随机值return new Random().nextInt();}};System.out.println(supplier.get());System.out.println("********************");//② 使用lambda表达式,supplier = () -> new Random().nextInt();System.out.println(supplier.get());System.out.println("********************");//③ 使用方法引用Supplier<Double> supplier2 = Math::random;System.out.println(supplier2.get());
}

看一下这段代码,我们通过创建一个 Supplier 对象,实现了一个 get 方法,这个方法无参数,返回一个值;所以,每次使用这个接口的时候都会返回一个值,并且保存在这个接口中,所以说是一个容器。

Supplier<Integer> supplier = new Supplier<Integer>() {@Overridepublic Integer get() {//返回一个随机值return new Random().nextInt();}};
Supplier<Double> supplier2 = Math::random;
System.out.println(supplier2.get());

runnable、callable、consumer、supplier相关推荐

  1. Java:Stream三部曲(一):函数式接口的理解与常用示例(Runnable、Comparator、Callable、Consumer、Predicate、Supplier、Function)

    目录 摘要 一.函数式接口(Functional Interface) 定义 附注 示例 二.JDK中常用的函数式接口 概览 1. Runnable 2. Comparator 用途:一个比较顺序的方 ...

  2. 一次搞懂 Runnable、Callable、Future、FutureTask,不懂不要钱!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 一般创建线程只有两种方式,一种是继承Thread,一种是实 ...

  3. Runnable、Callable、Executor、Future、FutureTask关系解读

    Future 介绍 Future表示异步计算的结果,它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果.Future的cancel方法可以取消任务的执行,它有一布尔参数,参数为 tru ...

  4. 面试又挂了,你理解了 Java 8 的 Consumer、Supplier、Predicate和Function吗?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 >>广而告之:打卡有奖活动火热进行中,快来参与吧,来了就有奖 今天我们还讲讲Consumer.Supplier ...

  5. Java8之Consumer、Supplier、Predicate和Function攻略

    今天我们还讲讲Consumer.Supplier.Predicate.Function这几个接口的用法,在 Java8 的用法当中,这几个接口虽然没有明目张胆的使用,但是,却是润物细无声的.为什么这么 ...

  6. Java中的Runnable、Callable、Future、FutureTask

    Java中存在Runnable.Callable.Future.FutureTask这几个与线程相关的类或者接口,在Java中也是比较重要的几个概念,我们通过下面的简单示例来了解一下它们的作用于区别. ...

  7. Java中的Runnable、Callable、Future、FutureTask的区别与示例

    原文地址:http://blog.csdn.net/bboyfeiyu/article/details/24851847 --------------------------------------- ...

  8. 【Java 进阶】匿名类(代码传递、回调、过滤器)、Lambda表达式(方法引用)、函数式接口(Supplier、Consumer、Predicate、Function)

    匿名类 匿名类(Anonymous Class) 匿名类的使用注意 匿名类 - 代码传递 - 测试代码运行时间的工具类 匿名类 - 回调 - 简易网络请求 匿名类 - 过滤器 - 获取目录下的所有文件 ...

  9. JAVA day24,25,26 异常(try、catch、finally、throw、throws),线程(Thread、Runnable、Callable)

    一.异常 异常 :指的是程序在执⾏过程中,出现的⾮正常的情况,最终会导致JVM的⾮正常停⽌. 在Java等⾯向对象的编程语⾔中,异常本身是⼀个类,产⽣异常就是创建异常对象并抛出了⼀个 异常对象.Jav ...

  10. Thread、Runnable和Callable

    1. 关于Thread的Runnable和Callable接口 其实非常简单:其实他们的区别就是Callable有返回值并且可以抛出异常. /** * Represents a command tha ...

最新文章

  1. Sublime 快捷键及使用技巧
  2. 前端 验证码隐藏怎么实现_完成图形验证码
  3. 升级vue-cli为 cli3 并创建项目
  4. 机器学习中的常见问题—损失函数
  5. 安装python步骤-小白入门:Python安装的10个步骤,极其细致!!
  6. Android中自定义xmlns
  7. 哈希表查找速度为什么那么快?快在哪里了?
  8. Paper:关于人工智能的所有国际顶级学术会简介(IJCAI、ICLR、AAAI 、COLT、CVPR、ICCV 等)之详细攻略(持续更新,建议收藏!)
  9. 王融(1979-),女,中国信息通信研究院互联网法律中心副主任、高级工程师...
  10. 1979. 找出数组的最大公约数
  11. Wix 安装部署(五) Bootstrapper 捆绑安装
  12. java string hash变量_java基础(六)-----String性质深入解析
  13. 图论算法——加权有向图的数据结构
  14. 微信APP支付的sgin拼接
  15. 记一次IDEA克隆项目代码启动问题
  16. 计算机如何更改扩展名,文件扩展名怎么改,怎样更改文件的扩展名
  17. 猫哥教你写爬虫 043--模拟浏览器
  18. html 图片显示的几种方式
  19. python最少钞票_钞票最少张数
  20. C++ 学生姓名学号 字符串

热门文章

  1. Linux(CentOS7)搭建LAMP服务环境
  2. Git 从0到入土 总结
  3. shader TileMap html的Canvas绘图 缓动/反弹动作 unity
  4. 电商社区怎么做?看服饰大佬如何通过粉丝圈激活客户
  5. JAVA图形界面设计
  6. dellR720xd服务器做raid安装操作系统
  7. Crowd Counting by Adaptively Fusing Predictions from an Image Pyramid (BMVC2018)
  8. Kubernetes Linux机器预置docker环境
  9. android9.0蓝牙功能,Android9.0 蓝牙开启流程
  10. Android4.4蓝牙耳机HFP流程分析-1