Java8新特性 consumer
Consumer 是 Java 8 引入的一个函数式接口,用于表示接受一个输入参数但不返回结果的操作。
Consumer接口在Java 8的函数式编程中非常有用,特别是在需要执行副作用操作(如打印、修改对象状态等)而不需要返回结果的场景中。
下面是一些常见的使用示例:
基本用法
Consumer<String> printConsumer = str -> System.out.println(str);
printConsumer.accept("Hello, Consumer!"); // 输出: Hello, Consumer!
集合遍历
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");// 使用Consumer遍历列表
names.forEach(name -> System.out.println(name));// 使用方法引用简化
names.forEach(System.out::println);
组合Consumer
Consumer<String> printUpperCase = s -> System.out.println(s.toUpperCase());
Consumer<String> printLowerCase = s -> System.out.println(s.toLowerCase());// 使用andThen组合两个Consumer
Consumer<String> printBoth = printUpperCase.andThen(printLowerCase);
printBoth.accept("Hello"); // 输出: HELLO 和 hello
实际应用场景
数据处理管道:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);Consumer<Integer> square = n -> System.out.println(n * n);
Consumer<Integer> cube = n -> System.out.println(n * n * n);numbers.forEach(square.andThen(cube));
对象属性修改:
class Person {String name;// 构造方法、getter和setter省略
}List<Person> people = Arrays.asList(new Person("Alice"), new Person("Bob"));Consumer<Person> namePrinter = p -> System.out.println(p.getName());
Consumer<Person> nameModifier = p -> p.setName(p.getName().toUpperCase());people.forEach(nameModifier.andThen(namePrinter));
资源处理:
Consumer<BufferedReader> fileProcessor = reader -> {try {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}
};try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {fileProcessor.accept(br);
}
与Optional结合使用
Optional<String> optional = Optional.of("Hello");// 如果值存在,执行Consumer操作
optional.ifPresent(System.out::println); // 输出: HelloOptional.empty().ifPresent(System.out::println); // 不执行任何操作