未读代码 未读代码
首页
  • 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 函数接口
    • Java 8 Predicate 函数接口
    • Java 8 forEach 遍历
    • Java 8 BiFunction 函数接口
    • Java 8 BiPredicate 函数接口
    • Java 8 UnaryOperator 函数接口
      • 1. UnaryOperator
      • 2. UnaryOperator.identity
      • 3. UnaryOperator 作为参数
      • 4. UnaryOperator 多个参数
      • 参考
  • Java 新特性
  • Java8 新特性
程序猿阿朗
2021-08-02

Java 8 UnaryOperator 函数接口

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

从源码里也可以看到 UnaryOperator 是 Function 接口的子类。

package java.util.function;

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

    static <T> UnaryOperator<T> identity() {
        return t -> t;
    }
}
1
2
3
4
5
6
7
8
9

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

# 1. UnaryOperator

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

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);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

输出结果:

WDBYTE.COM
WDBYTE.COM
1
2

# 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);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

输出结果:

{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}
1
2
3

# 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;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

输出结果:

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

# 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;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

输出结果:

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

# 参考

- Java 8 Function 函数接口

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

订阅

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

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

← Java 8 BiPredicate 函数接口

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

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

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