Java8

Wesley13
• 阅读 672

    不管lambda表达式还是Stream流式编程,Function、Consumer、Supplier、Predicate 四个接口是一切函数式编程的基础。下面我们详细学习这四个巨头,

interface Supplier

    该接口的中文直译是“提供者”,可以理解为定义一个lambda表达式,没有输入参数,返回一个T类型的值。

Supplier<Integer> supplier = () -> 10;
//输出10
System.out.println(supplier.get());

interface Consumer

    该接口的中文直译是“消费”,可以理解为定义一个lambda表达式,接收一个T类型的参数,并且没有返回值。

  • accept :接收参数,并调用Consumer接口里的方法

    Consumer print = x -> System.out.println(x); //输出10 print.accept(10);

  • andThen:调用完consumer自己后,还调用andThen方法参数中指定的Consumer

    Consumer print = x -> System.out.println(x); Consumer printPlusSelf = x -> System.out.println(x + x);

    //输出10以及20 print.andThen(printPlusSelf).accept(10);

interface Function<T, R>

        该接口的中文直译是“函数”,可以理解为:定义一个lambda表达式接收一个T类型的参数,返回一个R类型的值。

  • apply:传入一个T类型的参数,返回一个R类型的值

    Function<Integer, Integer> plusSelf = x -> x + x;

    //apply System.out.println(plusSelf.apply(10));

  • compose:accept获取到的参数,先执行compose里面的Function,再执行原Function

        //两个function
        Function<Integer, Integer> plusSelf = x -> {
            System.out.println("plusSelf");
            return x + x;
        };
        Function<Integer, String> toString = x -> {
            System.out.println("toString");
            return String.valueOf(x);
        };
    
        //输出20,整数10先自加变成20,然后由toString转换成字符串
        String string1 = toString.compose(plusSelf).apply(10);
        System.out.println(string1);
    
  • andThen:与compose相反。先执行原Function,在执行andThen里面的Function。

        //两个function
        Function<Integer, Integer> plusSelf = x -> {
            System.out.println("plusSelf");
            return x + x;
        };
        Function<Integer, String> toString = x -> {
            System.out.println("toString");
            return String.valueOf(x);
        };
    
        //输出20, 先自加,再转换成字符串
        String string2 = plusSelf.andThen(toString).apply(10);
        System.out.println(string2);
    

interface Predicate

    该接口的中文直译是“断言”,用于返回false/true。T是lambda表达式的输入参数类型。

  • test :测试test方法中输入参数是否满足接口中定义的lambda表达式

        Predicate<String> test = x -> "test".equals(x);
        Predicate<String> test2 = x -> "test2".equals(x);
    
        //test
        System.out.println(test.test("test")); //true
        System.out.println(test.test("test_false")); //false
    
  • and :原 Predicate 接口和 and 方法中指定的 Predicate 接口要同时为true,test方法才为true。与逻辑运算符 && 一致。

        Predicate<String> test = x -> "test".equals(x);
        Predicate<String> test2 = x -> "test2".equals(x);
    
        //and
        System.out.println(test.and(test2).test("test")); //false
    
  • negate:对结果取反后再输出

        Predicate<String> test = x -> "test".equals(x);
        Predicate<String> test2 = x -> "test2".equals(x);
    
        //negate
        System.out.println(test.negate().test("test")); //false
    
  • or:原 Predicate 接口和 or 方法中指定的 Predicate 接口只要一个为true,test方法为true。与逻辑运算符 || 一致。

        Predicate<String> test = x -> "test".equals(x);
        Predicate<String> test2 = x -> "test2".equals(x);
        //or
        System.out.println(test.or(test2).test("test")); //false
    

相关资料

Java 8 函数式编程系列

java8 -函数式编程之Lambda表达式

    java8 -函数式编程之四个基本接口

    java8 -函数式编程之Optional

    java8 -函数式编程之Stream

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Stella981 Stella981
3年前
JS 对象数组Array 根据对象object key的值排序sort,很风骚哦
有个js对象数组varary\{id:1,name:"b"},{id:2,name:"b"}\需求是根据name或者id的值来排序,这里有个风骚的函数函数定义:function keysrt(key,desc) {  return function(a,b){    return desc ? ~~(ak
Wesley13 Wesley13
3年前
Java8—一万字的Lambda表达式的详细介绍与应用案例
  基于Java8详细介绍了lambda表达式的语法与使用,以及方法引用、函数式接口、lambda复合等Java8的新特性!文章目录1Lambda的概述2函数式接口2.1Consumer消费型接口2.2Supplier供给型接口2.3Function<T,R函数型接口
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这