未读代码 未读代码
首页
  • Java 18 新功能介绍
  • Java 17 新功能介绍
  • Java 16 新功能介绍
  • Java 15 新功能介绍
  • Java 14 新功能介绍
  • Java 8 新特性

    • Java 8 Lambda 表达式
    • Java 8 Stream 流式操作
    • Java 8 时间处理介绍
    • Java 8 Optional 介绍
  • Java 开发工具
Java 源码分析
Spring Boot 系列
  • Arthas 问题定位
  • JMH 基准测试
GitHub (opens new window)
首页
  • Java 18 新功能介绍
  • Java 17 新功能介绍
  • Java 16 新功能介绍
  • Java 15 新功能介绍
  • Java 14 新功能介绍
  • Java 8 新特性

    • Java 8 Lambda 表达式
    • Java 8 Stream 流式操作
    • Java 8 时间处理介绍
    • Java 8 Optional 介绍
  • Java 开发工具
Java 源码分析
Spring Boot 系列
  • Arthas 问题定位
  • JMH 基准测试
GitHub (opens new window)
  • Java 新特性

  • Java8 新特性

    • Java 8 Lambda 和 Comparator 排序
    • Java 8 Optional 介绍
    • Java 8 Lambda 表达式介绍
    • Java 8 Stream 流式操作
    • Java 8 LocalDate、LocalDateTime 时间处理介绍
    • Java 8 List 转 Map
    • Java 8 Function 函数接口
    • Java 8 Supplier 函数接口
    • Java 8 Consumer 函数接口
      • 1. Consumer accept
      • 2. Consumer andThen
      • 3. Consumer forEach
      • 4. Consumer 扩展
      • 参考
    • Java 8 Predicate 函数接口
    • Java 8 forEach 遍历
    • Java 8 BiFunction 函数接口
    • Java 8 BiPredicate 函数接口
    • Java 8 UnaryOperator 函数接口
  • Java 新特性
  • Java8 新特性
程序猿阿朗
2021-07-22

Java 8 Consumer 函数接口

这篇文章属于 Java 8 教程(LTS)系列教程,点击阅读更多相关文章。

Java 中的 Consumer 是一个函数式接口,它可以接受一个泛型 <T> 类型参数,进行处理后无任何返回值。例如传入一个字符串,打印一个字符串。

源码:Consumer 在 Java 8 中的实现。

import java.util.Objects;

@FunctionalInterface
public interface Consumer<T> {

    void accept(T t);
    
    default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

# 1. Consumer accept

accept() 方法即是 Consumer 函数式接口的函数方法,传入一个任意类型,无返回值,可以用于 Lambda 表达式和方法引用。

示例:输出字符串的长度,输出字符串本身。

import java.util.function.Consumer;

public class Java8Consumer {

    public static void main(String[] args) {
        Consumer<String> lengthConsumer = s -> System.out.println(s.length());
        lengthConsumer.accept("www.wdbyte.com");
        
        Consumer<String> printConsumer = System.out::println;
        printConsumer.accept("www.wdbyte.com");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

输出结果:

14
www.wdbyte.com
1
2

# 2. Consumer andThen

andThen() 方法可以传入一个 Consumer,返回组合了两个 Consumer 后的 Consumer ,传入的 Consumer 不能为 null,否则会得到 NullPointerException。

示例:先输出字符串的长度,再输出字符串本身。

import java.util.function.Consumer;

public class Java8ConsumerAndThen {

    public static void main(String[] args) {
        Consumer<String> lengthConsumer = s -> System.out.println(s.length());
        Consumer<String> printConsumer = lengthConsumer.andThen(System.out::println);
        printConsumer.accept("www.wdbyte.com");
    }
}
1
2
3
4
5
6
7
8
9
10

输出结果:

14
www.wdbyte.com
1
2

# 3. Consumer forEach

集合中的 forEach 是通过 Consumer 实现的。

示例:实现一个 forEach 方法,输出 List 中的字符串,输出 List 中的字符串长度。

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

public class Java8ConsumerForEach {

    public static void main(String[] args) {
        Consumer<String> printConsumer = System.out::println;
        List<String> list = Arrays.asList("java", "node", "www.wdbyte.com");
      
        forEach(list, printConsumer);
        forEach(list, s -> System.out.println(s.length()));
    }

    public static <T> void forEach(List<T> list, Consumer<T> consumer) {
        for (T t : list) {
            consumer.accept(t);
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

输出结果:

java
node
www.wdbyte.com
4
4
14
1
2
3
4
5
6

# 4. Consumer 扩展

除了 Consumer 之外,Java 8 还提供了适用于不同类型的 Consumer。

函数接口 描述
BiConsumer 传入两个任意类型参数,无返回值
DoubleConsumer 传入一个 double 参数,无返回值
IntConsumer 传入一个 int 参数,无返回值
LongConsumer 传入一个 long 参数,无返回值
ObjDoubleConsumer 传入一个任意类型参数,一个 double 参数,无返回值
ObjIntConsumer 传入一个任意类型参数,一个 int 参数,无返回值
ObjLongConsumer 传入一个任意类型参数,一个 long 参数,无返回值

示例:使用 ObjIntConsumer 输出集合中字符串长度为 4 的字符串。

public class Java8ObjIntConsumer {

    public static void main(String[] args) {
        List<String> list = Arrays.asList("java", "node", "www.wdbyte.com");
        ObjIntConsumer<String> consumer = (str, i) -> {
            if (str.length() == i) {
                System.out.println(str);
            }
        };
        forEach(list, consumer, 4);
    }

    public static <T> void forEach(List<T> list, ObjIntConsumer<T> consumer, int i) {
        for (T t : list) {
            consumer.accept(t, i);
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

输出结果:

java
node
1
2

# 参考

  • Consumer (Java Platform SE 8 ) (opens new window)

扩展阅读:Java 8 Function 函数接口

订阅

文章持续更新,订阅可以关注「 程序猿阿朗 」公众号或者未读代码博客。

文章作者: 程序猿阿朗
文章链接:https://www.wdbyte.com/java8/java8-consumer/
版权声明:本网站当前文章采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 未读代码!
#Java8#Function Interface#Java8 Consumer
上次更新: 2022/12/05, 08:18:32
Java 8 Supplier 函数接口
Java 8 Predicate 函数接口

← Java 8 Supplier 函数接口 Java 8 Predicate 函数接口→

最近更新
01
如何搭建一个自己的音乐服务器
12-04
02
JUnit 5 单元测试教程
11-17
03
使用 StringUtils.split 的坑
11-02
更多文章>

提示:评论前请刷新页面,否则评论的可能不是当前文章。

Theme by Vdoing | Copyright © 2018-2022 程序猿阿朗 | MIT License | 皖ICP备20000567号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式