前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Java进阶】常用函数式接口的使用方法

【Java进阶】常用函数式接口的使用方法

作者头像
全栈开发日记
发布2023-10-22 19:54:03
2260
发布2023-10-22 19:54:03
举报
文章被收录于专栏:全栈开发日记全栈开发日记

随着Lambda的出现,JDK1.8引入了java.util.function包,这个包中包含了一系列的函数式接口,这些接口用于支持Lambda表达式和方法引用。

java.util.function包下主要有四个常用的接口,分别是ConsumerSupplierPredicateFunction

Consumer接口

代码语言:javascript
复制
public void consumerFunction(){
    Consumer<String> consumer = System.out::println;
    consumer.accept("测试");
}

以上是java.util.function.Consumer的简单使用。它用于接受一个输入参数并执行操作,但不会返回任何结果。

Supplier接口

代码语言:javascript
复制
public void supplierFunction() {
    Supplier<String> supplier = () -> UUID.randomUUID().toString();
    System.out.println(supplier.get());
}

以上是java.util.function.Supplier的简单使用。Supplier 接口只有一个抽象方法 T get(),该接口用于返回一个结果,并且不接受任何参数。

代码语言:javascript
复制
Optional<String> optional = Optional.empty();
Supplier<String> supplier = () -> UUID.randomUUID().toString();
System.out.println(optional.orElseGet(supplier));

以上是Supplier接口的经典使用,与Optional配合使用,Optional.empty()返回一个空值的Optionaloptional.orElseGet用于返回一个值,判断Optional是否为空值,如果是空值就通过Supplier接口返回一个值。

Predicate接口

Predicate是一个判断接口,主要用来判断传入的参数是否符合先前设置的条件,返回布尔值,它有1个抽象方法 、4个默认方法以及1一个静态方法。静态方法很好理解使用也较少,所以这里不对静态方法示例。

test方法

下面是boolean test(T t)方法的基本用法:

代码语言:javascript
复制
Predicate<Integer> predicate = i -> i > 0;
System.out.println(predicate.test(10));

以上代码通过Lambda表达式来创建一个Predicate对象,代码中Predicate被定义为接收一个整数参数并检查它是否大于0。当调用predicate.test(10)时,它会检查10是否大于0,因此返回值为true

and方法

Predicate<T> and(Predicate<? super T> other)方法是接口中的一个默认方法,表示并且含义,也就是进行多次判断是否符合条件。

代码语言:javascript
复制
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Predicate<Integer> predicate1 = i -> i > 2; // 条件1
Predicate<Integer> predicate2 = i -> i < 6; // 条件2
List<Integer> collect = list.stream().filter(
        predicate1.and(predicate2)
).collect(Collectors.toList());

以上示例中collect输出结果为:[3, 4, 5]。示例中对集合list进行过滤出符合条件1并且同时符合条件2的元素。

or方法

and方法用法相似,表示或者,多个条件中满足一个即可。这里将上面的示例改写一下:

代码语言:javascript
复制
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Predicate<Integer> predicate1 = i -> i < 2; // 条件1
Predicate<Integer> predicate2 = i -> i > 8; // 条件2
List<Integer> collect = list.stream().filter(
        predicate1.or(predicate2)
).collect(Collectors.toList());

以上示例中collect输出结果为:[1, 9, 10]。示例中对集合list进行过滤出符合条件1或者符合条件2的元素。

negate方法

and方法用法相似,表示,即取反。这里还是将上面的示例改写一下:

代码语言:javascript
复制
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Predicate<Integer> predicate1 = i -> i < 2; // 条件1
Predicate<Integer> predicate2 = i -> i > 8; // 条件2
List<Integer> collect = list.stream().filter(
        predicate1.or(predicate2).negate()   // 只加了negate()
).collect(Collectors.toList());

以上示例中collect输出结果为:[2, 3, 4, 5, 6, 7, 8]。将符合条件的元素反选输出。

Function接口

java.util.function.Function是一个功能型接口,用于将参数根据预定规则处理并输出。该接口有1个抽象方法和2两个默认方法,以及1个静态方法。

apply方法

R apply(T t)方法就像是Function接口的启动器,调用了apply才能发挥它的作用。

代码语言:javascript
复制
Function<String, Integer> strToInt = e -> Integer.parseInt(e);
System.out.println(
        strToInt.apply("123").getClass().getName()
);

以上示例输出结果为:java.lang.Integer。通过strToInt将字符串"123"转为Integer输出。

composeandThen方法

compose(Function before)方法传入一个Function ,并且返回一个新的Function 它先执行 before 函数对象的 apply 方法,然后将结果传递给当前函数对象的 apply 方法。

代码语言:javascript
复制
Function<String, Integer> function1 = e -> Integer.parseInt(e)+1;
Function<Integer, String> function2 = Object::toString;
Function<String, String> function3 = function2.compose(function1);
System.out.println(
        function3.apply("1")
);

以上示例输出结果为:2。通过将function2function1像结合,先执行function1再将结果传递给function2再次计算并输出。

andThen方法与compose用法可以说是一摸一样,与compose不同的是先执行当前函数对象的 apply 方法。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-10-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 全栈开发日记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Consumer接口
  • Supplier接口
  • Predicate接口
    • test方法
      • and方法
        • or方法
          • negate方法
          • Function接口
            • apply方法
              • compose与andThen方法
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档