Java 8 UnaryOperator 函数接口

在 Java 8 中,UnaryOperator 函数接口和 Function 函数接口十分相似,是 Function 函数接口的扩展,它可以传入一个泛型 T 参数,返回一个泛型 T 结果。

从源码里也可以看到 UnaryOperatorFunction 接口的子类。

package java.util.function;

@FunctionalInterface
public interface UnaryOperator<T> extends Function<T, T> {

    static <T> UnaryOperator<T> identity() {
        return t -> t;
    }
}

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

1. UnaryOperator

示例:分别使用 UnaryOperatorFunction 把字符串转换为大写形式。

package com.wdbyte;

import java.util.Locale;
import java.util.function.Function;
import java.util.function.UnaryOperator;

public class Java8UnaryOperator {

    public static void main(String[] args) {
        Function<String, String> upperFun1 = s -> s.toUpperCase();
        UnaryOperator<String> upperFun2 = s -> s.toUpperCase();

        String res1 = upperFun1.apply("wdbyte.com");
        String res2 = upperFun2.apply("wdbyte.com");

        System.out.println(res1);
        System.out.println(res2);
    }
}

输出结果:

WDBYTE.COM
WDBYTE.COM

2. UnaryOperator.identity

不做任何处理,直接返回参数本身,和 Function.identify() 效果一样。

示例:把字符串集合转换成 key 为大写字符串,value 为字符串本身的 Map(使用 identity 方法返回本身)。

package com.wdbyte;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.function.UnaryOperator;
import java.util.stream.Collectors;

public class Java8UnaryOperatorIdentify {

    public static void main(String[] args) {
        Function<String, String> upperFun1 = s -> s.toUpperCase();
        UnaryOperator<String> upperFun2 = s -> s.toUpperCase();

        List<String> list = Arrays.asList("java", "node", "c++", "rust", "www.wdbyte.com");

        Map<String, String> map1 = list.stream()
            .collect(Collectors.toMap(upperFun1::apply, Function.identity()));

        Map<String, String> map2 = list.stream()
            .collect(Collectors.toMap(upperFun2::apply, UnaryOperator.identity()));
      
        Map<String, String> map3 = list.stream()
            .collect(Collectors.toMap(upperFun2::apply, t -> t));

        System.out.println(map1);
        System.out.println(map2);
        System.out.println(map3);
    }
}

输出结果:

{JAVA=java, C++=c++, RUST=rust, NODE=node, WWW.WDBYTE.COM=www.wdbyte.com}
{JAVA=java, C++=c++, RUST=rust, NODE=node, WWW.WDBYTE.COM=www.wdbyte.com}
{JAVA=java, C++=c++, RUST=rust, NODE=node, WWW.WDBYTE.COM=www.wdbyte.com}

3. UnaryOperator 作为参数

示例:使用 UnaryOperator 作为参数,修改 List 集合中每个元素。

package com.wdbyte;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.function.UnaryOperator;
import java.util.stream.Collectors;

public class Java8UnaryOperatorParam {

    public static void main(String[] args) {
        List<String> list = Arrays.asList("java", "node", "c++", "rust", "www.wdbyte.com");
        UnaryOperator<String> upperFun = s -> s.toUpperCase();
        List<String> resultList = map(list, upperFun);
        System.out.println(resultList);

        List<Integer> intList = Arrays.asList(1, 2, 3, 4, 5);
        UnaryOperator<Integer> doubleInt = i -> i * 2;
        List<Integer> integers = map(intList, doubleInt);
        System.out.println(integers);
    }

    public static <T> List<T> map(List<T> list, UnaryOperator<T> unaryOperator) {
        List<T> resultList = new ArrayList<>();
        for (T t : list) {
            resultList.add(unaryOperator.apply(t));
        }
        return resultList;
    }
}

输出结果:

[JAVA, NODE, C++, RUST, WWW.WDBYTE.COM]
[2, 4, 6, 8, 10]

4. UnaryOperator 多个参数

示例:使用 UnaryOperator 作为参数,修改 List 集合中每个元素,先转大写,再截取前三位。

package com.wdbyte;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.UnaryOperator;

public class Java8UnaryOperatorParams {

    public static void main(String[] args) {
        List<String> list = Arrays.asList("java", "node", "c++", "rust", "www.wdbyte.com");
        // 转大写
        UnaryOperator<String> upperFun = s -> s.toUpperCase();
        // 截取 3 位
        UnaryOperator<String> subFun = s -> s.substring(0, 3);
        List<String> resultList = map(list, upperFun, subFun);
        System.out.println(resultList);
    }

    public static <T> List<T> map(List<T> list, UnaryOperator<T>... unaryOperator) {
        List<T> resultList = new ArrayList<>();
        for (T t : list) {
            for (UnaryOperator<T> operator : unaryOperator) {
                t = operator.apply(t);
            }
            resultList.add(t);
        }
        return resultList;
    }
}

输出结果:

[JAV, NOD, C++, RUS, WWW]

参考

- Java 8 Function 函数接口

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