Java UnaryOperator 接口
最后修改时间:2025 年 4 月 16 日
java.util.function.UnaryOperator 接口表示对单个操作数执行操作,并产生相同类型的结果。它扩展了 Function 接口,并且是一个函数式接口,具有 apply 方法。UnaryOperator 常用在输入和输出类型匹配的转换中。
UnaryOperator 是 Java 8 中新增的 Java 函数式编程实用程序的一部分。它专门用于输入和输出类型相同的情况,简化了类型声明并提供了类型安全。
UnaryOperator 接口概述
UnaryOperator 接口包含一个从 Function 继承的抽象方法和几个静态方法。关键方法 apply 对输入执行操作。静态方法提供有用的运算符实例。
@FunctionalInterface
public interface UnaryOperator<T> extends Function<T, T> {
static <T> UnaryOperator<T> identity();
}
以上代码展示了 UnaryOperator 接口的结构。它通过相同的输入和输出类型扩展了 Function。identity 方法返回一个 UnaryOperator,该运算符始终返回其输入参数。
UnaryOperator 的基本用法
使用 UnaryOperator 最简单的方法是使用 lambda 表达式。我们定义如何将输入转换为相同类型的输出。示例对整数进行平方。
package com.zetcode;
import java.util.function.UnaryOperator;
public class Main {
public static void main(String[] args) {
// Define a UnaryOperator that squares integers
UnaryOperator<Integer> square = x -> x * x;
// Apply the operator
System.out.println("Square of 5: " + square.apply(5));
System.out.println("Square of 12: " + square.apply(12));
// UnaryOperator using method reference
UnaryOperator<String> toUpper = String::toUpperCase;
System.out.println("Uppercase: " + toUpper.apply("hello"));
}
}
此示例演示了使用 lambda 和方法引用的 UnaryOperator 基本用法。square 运算符接受 Integer 并返回 Integer。toUpper 运算符将字符串转换为大写。两者都保持输入-输出类型。
UnaryOperator 组合
UnaryOperator 从 Function 继承组合方法。andThen 和 compose 允许链接操作,同时保持类型一致性。这创建了强大的转换管道。
package com.zetcode;
import java.util.function.UnaryOperator;
public class Main {
public static void main(String[] args) {
// First operator increments by 1
UnaryOperator<Integer> increment = x -> x + 1;
// Second operator multiplies by 2
UnaryOperator<Integer> doubler = x -> x * 2;
// Compose the operators
UnaryOperator<Integer> incrementThenDouble = increment.andThen(doubler);
UnaryOperator<Integer> doubleThenIncrement = doubler.andThen(increment);
System.out.println("Increment then double 5: " + incrementThenDouble.apply(5));
System.out.println("Double then increment 5: " + doubleThenIncrement.apply(5));
}
}
此示例展示了 UnaryOperator 组合。我们在保持 Integer 类型的同时链接数学运算。运算顺序会显着影响最终结果。
UnaryOperator Identity(恒等式)
UnaryOperator.identity 方法返回一个运算符,该运算符始终不加修改地返回其输入参数。它在转换管道中用作默认或中性操作。
package com.zetcode;
import java.util.function.UnaryOperator;
public class Main {
public static void main(String[] args) {
// Identity operator
UnaryOperator<String> identity = UnaryOperator.identity();
System.out.println("Identity applied: " + identity.apply("test"));
// Practical use with optional transformation
UnaryOperator<String> transformer = someCondition()
? String::toUpperCase
: UnaryOperator.identity();
System.out.println("Result: " + transformer.apply("conditional"));
}
private static boolean someCondition() {
return false;
}
}
此示例演示了 UnaryOperator.identity。identity 运算符不加修改地返回其输入。当需要条件转换但有时不需要操作时,它用作中性元素。
将 UnaryOperator 与 Streams 一起使用
UnaryOperator 与 Java Streams 自然地协同工作,用于原地转换。当输入和输出类型匹配时,map 操作接受 UnaryOperator。这可以实现干净的数据处理管道。
package com.zetcode;
import java.util.Arrays;
import java.util.List;
import java.util.function.UnaryOperator;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// UnaryOperator to square numbers
UnaryOperator<Integer> square = x -> x * x;
// Apply operator in stream
List<Integer> squaredNumbers = numbers.stream()
.map(square)
.collect(Collectors.toList());
System.out.println("Original: " + numbers);
System.out.println("Squared: " + squaredNumbers);
}
}
此示例展示了在 Streams 中使用 UnaryOperator。我们定义了一个平方运算符,并通过 map 将其应用于每个流元素。结果是一个新列表,其中包含转换后的值,同时始终保持 Integer 类型。
UnaryOperator 用于字符串操作
UnaryOperator 尤其适用于字符串转换,其中操作保留 String 类型。常见示例包括修剪、大小写转换和格式化。
package com.zetcode;
import java.util.function.UnaryOperator;
public class Main {
public static void main(String[] args) {
// Trim and capitalize string
UnaryOperator<String> trimAndCapitalize = s -> {
String trimmed = s.trim();
return trimmed.substring(0, 1).toUpperCase() +
trimmed.substring(1).toLowerCase();
};
System.out.println("Formatted: " + trimAndCapitalize.apply(" hELLO "));
// Repeat string three times
UnaryOperator<String> tripler = s -> s + s + s;
System.out.println("Tripled: " + tripler.apply("hi"));
}
}
此示例演示了使用 UnaryOperator 进行字符串操作。我们创建了用于清理和格式化字符串的运算符,同时保持 String 类型。这些运算符可以在不同的字符串处理场景中重复使用。
专门化的 UnaryOperator 变体
Java 为原始类型提供了专门化的 UnaryOperator 变体,以避免装箱开销。这些包括 IntUnaryOperator、LongUnaryOperator 和 DoubleUnaryOperator。
package com.zetcode;
import java.util.function.IntUnaryOperator;
import java.util.function.DoubleUnaryOperator;
public class Main {
public static void main(String[] args) {
// IntUnaryOperator example
IntUnaryOperator negate = x -> -x;
System.out.println("Negated: " + negate.applyAsInt(42));
// DoubleUnaryOperator example
DoubleUnaryOperator celsiusToFahrenheit = c -> (c * 9/5) + 32;
System.out.println("20°C in Fahrenheit: " +
celsiusToFahrenheit.applyAsDouble(20));
}
}
此示例展示了专门化的 UnaryOperator 变体。IntUnaryOperator 直接与 int 原语一起使用,避免了 Integer 装箱。同样,DoubleUnaryOperator 可以有效地处理 double 原语。
来源
在本文中,我们介绍了 Java UnaryOperator 接口的基本方法和特性。理解这些概念对于函数式编程和流处理中的类型安全转换至关重要。
作者
列出所有Java教程。