当前位置: 首页 > news >正文

Java 8中,Function,Consumer,Predicate,Supplier举例 ,以及CompletableFuture使用

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Function,Consumer,Predicate,Supplier这些接口有一个共性,就是都有一个@FunctionalInterface的注解, 有了这个注解,你就可以自定义lamda表达式了.

本文先介绍一些例子,然后自定义一个lamda表达式的接口.

先看一下Function接口定义:

    @FunctionalInterface    
    public interface Function<T, R>

接口接受两个泛型类型<T, R>.

再看一下接口定义的方法(非静态,非default), 支持lamda表达式的接口只允许定义一个抽象方法(@FunctionalInterface注解的接口,只允许定义一个抽象方法),只要记住这一点,你就不会弄混了.

    R apply(T t);    
    /**
     * T 入参类型, t 输入参数
     * R 返回值类型
     */

OK, 现在明确了, 该接口的lamda表达式应该是接受一个入参,最后要有一个返回值, 写法应该是这样的: (x) -> {return y;} 

如果你的lamda表达式非常简单,只有一行,那么你可以不写return, 不加花括号{}, 返回值后面可以不加分号.

下面就可以写example了, 写一个简单的, 再写一个标准的.

    public void testFunction(){
                //简单的,只有一行
		Function<Integer, String> function1 = (x) -> "test result: " + x;
		
		//标准的,有花括号, return, 分号.
		Function<String, String> function2 = (x) -> {
			return "after function1";
		};
		System.out.println(function1.apply(6));
		System.out.println(function1.andThen(function2).apply(6));
	}

OK, Function的例子写完了,接下来写其他的,其实原理懂了,其他的就都简单了,然后就是熟能生巧了.

 

再看看Supplier的接口定义,这个接口定义比较简单,我就都贴上来了

    @FunctionalInterface
    public interface Supplier<T> {

        /**
         * Gets a result.
         *
         * @return a result
         */
        T get();
    }

接口接受一个泛型<T>, 接口方法是一个无参数的方法, 有一个类型为T的返回值. OK, 那么接口的lamda表达式应该是这样的: () -> { return something; }, 好,下面来写一个example.

    public void testSupplier(){
                //简写
		Supplier<String> supplier1 = () -> "Test supplier";
		System.out.println(supplier1.get());
		
		//标准格式
		Supplier<Integer> supplier2 = () -> {
			return 20;
		};
		System.out.println(supplier2.get() instanceof Integer);
	}

到这里你或许有一点疑惑, 这Supplier到底能用在哪啊? Java 8里新增了一个异步线程的类,很牛逼,很强大的类: CompletableFuture, 里面的很多方法的入参都用到的Supplier, 例如: supplyAsync方法. 本文暂时不介绍CompletableFuture.

 

接下来是Consumer, 我们来看一下接口的定义:

    @FunctionalInterface
    public interface Consumer<T>

然后再看一下里面的抽象方法:

    void accept(T t);

现在了解了: 接口接受一个泛型<T>, 接口方法是入参类型为T, 无返回值的方法, OK,下面开始写example:

    public void testConsumer(){
		Consumer<String> consumer1 = (x) -> System.out.print(x);
		Consumer<String> consumer2 = (x) -> {
			System.out.println(" after consumer 1");
		};
		consumer1.andThen(consumer2).accept("test consumer1");
	}

 

接下来看一下Predicate接口

接口定义:

    @FunctionalInterface    
    public interface Predicate<T>

抽象方法:

    boolean test(T t);

接口接受一个泛型<T>, 接口方法的入参类型是T, 返回值是一个布尔值, OK, 下面写example:

    public void testPredicate(){
		Predicate<String> predicate = (x) -> x.length() > 0;
		System.out.println(predicate.test("String"));
	}

Predicate接口在stream里面用的比较多, 感兴趣的可以去看看stream, java 8 里另一个新的东西,很好玩.

 

 

 

到这里基本明白这些lamda表达式的接口怎么用了,接下来自定义一个支持lamda表达式的接口玩玩,

    @FunctionalInterface    
    public interface CustomLamda<T> {
    
    	T testCustomFunction(Consumer<T> cunsumer);
    	
    	/*如果把下面方法的注释放开, 那么接口就报错了. 验证了前面所说的:@FunctionalInterface注解的接口只允许         *有一个抽象方法
    	 */
        //T anErrorMethod();
    }

下面是实现:

    public void testCustomLamda(){
		Consumer<String> consumer = (x) -> {
			System.out.println("test" + x);
		};
		CustomLamda<String> customLamda = (x) -> {
			x.accept("6");
			return "6";
		};
		customLamda.testCustomFunction(consumer);
	}

CompletableFuture:

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
    int i = 1/0;
    return 100;

});

参考博文:

http://blog.csdn.net/zero__007/article/details/50571703#

http://www.cnblogs.com/leetieniu2014/p/5403277.htm
 

转载于:https://my.oschina.net/u/1266221/blog/769771

相关文章:

  • dict 没有 key 的情况
  • linux装oracle客户端
  • 聊聊自己的职业规划这个件事
  • 阿里云ECS Centos7 系统安装图形化桌面
  • iOS scrollView 的相关使用
  • 经典Java面试题-内部类
  • Android只需两步,使你的Android Studio支持Lambda表达式
  • 【Android】Android开发实现进度条效果,SeekBar的简单使用。音量,音乐播放进度,视频播放进度等...
  • 移动webapp前端ui用哪个框架好
  • 理解 iOS 的内存管理
  • 绘制动画及动画循环练习
  • Sublime插件支持Sass编译和Babel解析ES6 .sublime-build文件初探
  • SCCM 2016 + SQL 2016 + Win 2012 R2 安装教程
  • lduan server 2012证书服务角色分离(十七)
  • C#/VB.NET 获取电脑属性(硬盘ID、硬盘容量、Cpu序列号、MAC地址、系统类型)
  • [NodeJS] 关于Buffer
  • [译] 怎样写一个基础的编译器
  • 77. Combinations
  • Hibernate最全面试题
  • JavaScript的使用你知道几种?(上)
  • Java小白进阶笔记(3)-初级面向对象
  • JS变量作用域
  • php面试题 汇集2
  • React中的“虫洞”——Context
  • 搭建gitbook 和 访问权限认证
  • 如何解决微信端直接跳WAP端
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 小试R空间处理新库sf
  • 新手搭建网站的主要流程
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​如何在iOS手机上查看应用日志
  • #ifdef 的技巧用法
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (ibm)Java 语言的 XPath API
  • (转)【Hibernate总结系列】使用举例
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .gitignore文件—git忽略文件
  • .NET gRPC 和RESTful简单对比
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET 指南:抽象化实现的基类
  • .net 中viewstate的原理和使用
  • .NET 中创建支持集合初始化器的类型
  • .Net7 环境安装配置
  • .NET学习教程二——.net基础定义+VS常用设置
  • .net专家(高海东的专栏)
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • [ C++ ] STL_list 使用及其模拟实现
  • [ C++ ] 继承
  • [2021 蓝帽杯] One Pointer PHP
  • [AIGC] Spring Interceptor 拦截器详解
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [android] 请求码和结果码的作用
  • [Apio2012]dispatching 左偏树
  • [Assignment] C++1