栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 8 之 Consumer、Supplier、Predicate、Function

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 8 之 Consumer、Supplier、Predicate、Function

        今天看Java8新特性,看到里面有的示例代码调用了这些函数接口,一脸懵啊~

所以博主就查了一下资料,看看这些函数接口有什么用处,让后面容易理解点,废话不多说,我们开始吧!!

1.Consumer接口

        顾名思义,这是一个消费型接口,通过传入参数,然后输出值,不会返回值;在通俗点,就是你传一个参数进去,你可以对这个参数进行你想要的调整,然后输出出来,结束!

下面介绍使用方式及常用accept()、andThen()方法,还有其他Consumer接口:
  • accept(T t)        提供T类型的输入参数,不返回执行结果 
StringBuilder sb = new StringBuilder("Hello ");
//此处就是我定义的规则,进来的字符串拼接“Jack”字符串
Consumer consumer = (str) -> str.append("Jack!");
consumer.accept(sb);
//拼接完后进行输出
System.out.println(sb.toString());	// Hello Jack!
  • andThen(Consumer after)  拼接上一个consumer的规则 
Consumer consumer1 = (str) -> str.append(" Bob!");
consumer.andThen(consumer1).accept(sb);
System.out.println(sb.toString());	// Hello Jack! Bob!
  •  BiConsumer 提供两个自定义类型的参数,不返回执行结果,意思就是你可以输入两个值进去处理
StringBuilder sb = new StringBuilder();
BiConsumer biConsumer = (a, b) -> {
	sb.append(a);
	sb.append(b);
};
biConsumer.accept("Hello ", "Jack!");
System.out.println(sb.toString());	// Hello Jack!
  • 同时Consumer也可以被传入其他方法中使用,如下:
// 使用lambda表达式,forEach方法需要的就是一个Consumer接口
// Stream.of方法含义是将括号的值有序放入Stream中
Stream stream = Stream.of("aaa", "bbb", "ddd", "ccc", "fff");
Consumer consumer1 = (s) -> System.out.println(s);
//lambda表达式返回的就是一个Consumer接口
stream.forEach(consumer1);
//更直接的方式
//stream.forEach((s) -> System.out.println(s));

 总结:

①.除了上面的,还有IntConsumer、DoubleConsumer等接口,使用方式与上面一样

 

 2.Supplier接口 

        Supplier 接口是一个供给型的接口,其实,说白了就是一个容器,可以用来存储数据,然后可以供其他方法使用的这么一个接口,是不是很明白了,如果还是不明白,看看下面的例子,一定彻底搞懂!

    
    @Test
    public void test_Supplier() {
        //一、使用Supplier接口实现方法,只有一个get方法,无参数,返回一个值
        Supplier supplier = new Supplier() {
            @Override
            public 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 supplier2 = Math::random;
        System.out.println(supplier2.get());
    }

 使用需要Supplier的接口方法,如optional对象有需要Supplier接口的方法

    @Test
    public void test_Supplier2() {
        Stream stream = Stream.of(1, 2, 3, 4, 5);
        //返回一个optional对象
        Optional first = stream.filter(i -> i > 4)
                .findFirst();

        //optional对象有需要Supplier接口的方法
        //orElse,如果first中存在数,就返回这个数,如果不存在,就放回传入的数
        System.out.println(first.orElse(1));//输出结果5
        System.out.println(first.orElse(7));//输出结果5

        System.out.println("********************");

        Supplier supplier = new Supplier() {
            @Override
            public Integer get() {
                //返回一个随机值
                return new Random().nextInt();
            }
        };

        //orElseGet,如果first中存在数,就返回这个数,如果不存在,就返回supplier返回的值
        System.out.println(first.orElseGet(supplier));//输出结果5
    }

总结:
①.除了上面使用的 Supplier 接口,还可以使用下面这些 Supplier 接口。
IntSupplier 、DoubleSupplier 、LongSupplier 、BooleanSupplier,使用方法和上面一样。

②.Supplier 接口可以理解为一个容器,用于装数据的。

③.Supplier 接口有一个 get 方法,可以返回值。

 

3.Predicate 接口

        Predicate 接口是一个谓词型接口,其实,这个就是一个类似于 bool 类型的判断的接口

  • test (T t) 对给定的输入参数执行操作,返回一个boolean类型的结果(布尔值函数)
Predicate predicate = number -> number != 0;
System.out.println(predicate.test(10));    //true
  • and(Predicate other) 拼接一个Predicate条件
//承接上面一段代码
predicate = predicate.and(number -> number >= 10);
System.out.println(predicate.test(10));    //true
  • or(Predicate other) 就是或者了
// 承接上面代码
predicate = predicate.or(number -> number != 10);
System.out.println(predicate.test(10));    //true
  •  negate() 这个就是取反
// 承接上面代码
predicate = predicate.negate();
System.out.println(predicate.test(10));    //false

 

总结:
①.还可以使用 DoublePredicate接口,使用方式和上面一样。 ②.Predicate接口可以理解为一个用来做条件判断的接口

 

 

4.Function接口

        function的作用是转换,接收一个参数,返回一个结果;

        Function其中T代表输入参数,R代表返回参数

        我们看下示例,介绍一下常用方法就理解了

  • apply(T t)
    // 例如像定义的泛型一样,输入的参数为String类型,返回的参数为Integer类型
    Function test=i->Integer.parseInt(i)+1;
    test.apply("5");// 6

  • andThen(Function after)  先执行name在执行square
Function name = e -> e * 2;
Function square = e -> e * e;
int value = name.andThen(square).apply(3);// 36
  • compose(Function before) 先执行square在执行name
//承接上面代码
int value2 = name.compose(square).apply(3);// 18

总结:

①.除了上面使用的 Function 接口,还可以使用下面这些 Function 接口。
IntFunction 、DoubleFunction 、LongFunction 、ToIntFunction 、ToDoubleFunction 、DoubleToIntFunction 等等,使用方法和上面一样。

②. Function 接口是一个功能型接口,是一个转换数据的作用。
③. Function 接口实现 apply 方法来做转换。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/340760.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号