Java ObjIntConsumer 接口
最后修改时间:2025 年 4 月 16 日
java.util.function.ObjIntConsumer
接口表示一个操作,该操作接受一个对象值和一个 int 值参数,并且不返回任何结果。它是一个函数式接口,具有单个抽象方法 accept
。
ObjIntConsumer
是 Java 8 中添加的 Java 函数式编程实用程序的一部分。当您需要执行组合对象和基本 int 值的操作时,它会被使用。与常规消费者不同,它避免了自动装箱的开销。
ObjIntConsumer 接口概述
ObjIntConsumer
接口包含一个必须实现的抽象方法。该方法对给定的对象和 int 参数执行操作。此接口中没有默认方法或静态方法。
@FunctionalInterface public interface ObjIntConsumer<T> { void accept(T t, int value); }
上面的代码显示了 ObjIntConsumer
接口的结构。它使用泛型,其中 T 是对象参数的类型。该接口使用 @FunctionalInterface 进行注释,以指示其单个抽象方法的性质。
ObjIntConsumer 的基本用法
使用 ObjIntConsumer 的最简单方法是使用 lambda 表达式。我们定义了如何处理对象和 int 参数。示例显示了一个消费者,它打印两个值。
package com.zetcode; import java.util.function.ObjIntConsumer; public class Main { public static void main(String[] args) { // Define a consumer that prints object and int ObjIntConsumer<String> printCombined = (s, i) -> System.out.println("String: " + s + ", int: " + i); // Use the consumer printCombined.accept("Hello", 42); printCombined.accept("Java", 8); // Consumer with more complex logic ObjIntConsumer<String> repeatPrint = (str, count) -> { for (int i = 0; i < count; i++) { System.out.println(str); } }; repeatPrint.accept("Loop", 3); } }
此示例演示了使用 lambda 表达式的基本 ObjIntConsumer 用法。 printCombined 消费者只是简单地打印两个参数。 repeatPrint 消费者显示了更复杂的逻辑,根据 int 值多次打印一个字符串。
将 ObjIntConsumer 与集合一起使用
当您需要将元素与其索引或其他整数值组合时,ObjIntConsumer
可能会很有用。此示例演示了如何将其与列表一起使用。
package com.zetcode; import java.util.Arrays; import java.util.List; import java.util.function.ObjIntConsumer; public class Main { public static void main(String[] args) { List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); // Consumer to print name with index ObjIntConsumer<String> printIndexed = (name, index) -> System.out.println((index + 1) + ". " + name); // Process list with index for (int i = 0; i < names.size(); i++) { printIndexed.accept(names.get(i), i); } // Consumer to build a formatted string StringBuilder sb = new StringBuilder(); ObjIntConsumer<String> buildString = (s, i) -> { if (i > 0) sb.append(", "); sb.append(s).append(":").append(i); }; for (int i = 0; i < names.size(); i++) { buildString.accept(names.get(i), i); } System.out.println("Formatted: " + sb.toString()); } }
此示例显示了将 ObjIntConsumer 与名称列表一起使用。 printIndexed 消费者显示每个名称及其基于 1 的索引。 buildString 消费者创建一个格式化的字符串,将名称与其索引组合在一起。
ObjIntConsumer 在对象处理中的应用
当处理与整数值有一定关系的对象时,ObjIntConsumer
特别有用。此示例演示了更新购物车中的产品数量。
package com.zetcode; import java.util.HashMap; import java.util.Map; import java.util.function.ObjIntConsumer; class Product { String name; double price; Product(String name, double price) { this.name = name; this.price = price; } @Override public String toString() { return name + " ($" + price + ")"; } } public class Main { public static void main(String[] args) { Map<Product, Integer> cart = new HashMap<>(); cart.put(new Product("Laptop", 999.99), 1); cart.put(new Product("Mouse", 25.50), 2); cart.put(new Product("Keyboard", 45.75), 1); // Consumer to update product quantities ObjIntConsumer<Product> updateQuantity = (product, quantity) -> { int current = cart.getOrDefault(product, 0); cart.put(product, current + quantity); }; // Add more items to cart Product mouse = new Product("Mouse", 25.50); updateQuantity.accept(mouse, 3); Product headphones = new Product("Headphones", 79.99); updateQuantity.accept(headphones, 2); // Print final cart contents ObjIntConsumer<Product> printCartItem = (p, q) -> System.out.println(p + " x " + q + " = $" + (p.price * q)); cart.forEach((k, v) -> printCartItem.accept(k, v)); } }
此示例显示了将 ObjIntConsumer 用于购物车操作。 updateQuantity 消费者将指定数量添加到购物车中的产品。 printCartItem 消费者显示每个产品及其数量和总价。这演示了实用的对象-int 对处理。
将 ObjIntConsumer 与其他函数式接口结合使用
ObjIntConsumer
可以与其他函数式接口结合使用,以创建更复杂的操作。此示例展示了与 Predicate 和 Function 的集成。
package com.zetcode; import java.util.function.Function; import java.util.function.ObjIntConsumer; import java.util.function.Predicate; public class Main { public static void main(String[] args) { // Function to create greeting Function<String, String> greeter = name -> "Hello, " + name + "!"; // Predicate to check if number is even Predicate<Integer> isEven = n -> n % 2 == 0; // Consumer that combines both ObjIntConsumer<String> complexConsumer = (name, number) -> { String greeting = greeter.apply(name); String evenOdd = isEven.test(number) ? "even" : "odd"; System.out.println(greeting + " Your number is " + number + " which is " + evenOdd + "."); }; // Use the combined consumer complexConsumer.accept("Alice", 42); complexConsumer.accept("Bob", 7); // Another example with calculation ObjIntConsumer<Double> powerCalculator = (base, exponent) -> { double result = Math.pow(base, exponent); System.out.printf("%.2f^%d = %.2f%n", base, exponent, result); }; powerCalculator.accept(2.5, 3); powerCalculator.accept(10.0, -2); } }
此示例演示了将 ObjIntConsumer 与其他函数式接口结合使用。 complexConsumer 使用 Function 和 Predicate 创建更复杂的操作。 powerCalculator 显示了结合 double 和 int 值的数学运算。
ObjIntConsumer 在流处理中的应用
虽然 ObjIntConsumer
未在 Stream API 方法中直接使用,但它可以在您需要处理对象-int 对的流处理场景中提供帮助。此示例显示了自定义的类似流的操作。
package com.zetcode; import java.util.Arrays; import java.util.List; import java.util.function.ObjIntConsumer; public class Main { static <T> void processWithIndices(List<T> list, ObjIntConsumer<T> consumer) { for (int i = 0; i < list.size(); i++) { consumer.accept(list.get(i), i); } } public static void main(String[] args) { List<String> colors = Arrays.asList("Red", "Green", "Blue", "Yellow"); // Consumer to create indexed color codes ObjIntConsumer<String> colorCoder = (color, index) -> { String code = color.substring(0, 3).toUpperCase() + index; System.out.println(color + " -> " + code); }; processWithIndices(colors, colorCoder); // Another example with statistics int[] totals = new int[1]; ObjIntConsumer<Integer> summer = (num, weight) -> { totals[0] += num * weight; }; List<Integer> numbers = Arrays.asList(10, 20, 30, 40); processWithIndices(numbers, summer); System.out.println("Weighted total: " + totals[0]); } }
此示例显示了使用 ObjIntConsumer 的自定义流处理方法。 processWithIndices 方法将消费者应用于每个元素及其索引。 colorCoder 创建结合颜色名称和位置的代码。 summer 计算数字的加权总和。
ObjIntConsumer 用于配置
ObjIntConsumer
适用于配置场景,其中需要使用整数参数配置对象。此示例显示了设置应用程序模式。
package com.zetcode; import java.util.function.ObjIntConsumer; class Device { String name; int brightness; int volume; Device(String name) { this.name = name; } void displaySettings() { System.out.printf("%s - Brightness: %d, Volume: %d%n", name, brightness, volume); } } public class Main { public static void main(String[] args) { Device tv = new Device("Living Room TV"); Device speaker = new Device("Kitchen Speaker"); // Consumers for different device settings ObjIntConsumer<Device> setBrightness = (d, b) -> { d.brightness = Math.min(Math.max(b, 0), 100); }; ObjIntConsumer<Device> setVolume = (d, v) -> { d.volume = Math.min(Math.max(v, 0), 50); }; // Apply settings setBrightness.accept(tv, 75); setVolume.accept(tv, 30); setBrightness.accept(speaker, 0); // No brightness control setVolume.accept(speaker, 25); // Show final settings tv.displaySettings(); speaker.displaySettings(); // Consumer with validation ObjIntConsumer<Device> safeVolume = (d, v) -> { if (d.name.contains("Speaker") && v > 40) { System.out.println("Warning: High volume for speaker!"); } setVolume.accept(d, v); }; safeVolume.accept(speaker, 45); speaker.displaySettings(); } }
此示例演示了将 ObjIntConsumer 用于设备配置。不同的消费者处理亮度和音量设置以及适当的约束。 safeVolume 消费者添加了特定于扬声器设备的验证逻辑。这展示了 ObjIntConsumer 如何封装设置逻辑。
来源
在本文中,我们介绍了 Java ObjIntConsumer 接口的基本方法和特性。理解这些概念对于需要将对象与基本 int 值组合处理的场景非常有价值。
作者
列出所有Java教程。