总览

操作员重载有多种语言可用。 Java对String类型的+运算符的支持对运算符的重载非常有限。

我们可以利用其他语言支持运算符的不同方式,但是可以在Java中实现一个使用Java已经使用的约定的实现。

获取,设置和放置操作

集合的运算符重载的一个常见示例是使用数组符号a [b]访问集合本身。 当获取时很简单,因为List和Map都有一个get方法,这与JavaBean getXxx()命名约定一致。

List<String> text = ...
String s = text[2]; // text.get(2);Map<String, MyType> map = ...
MyType mt = map["Hello"]; // map.get("Hello")MyType mt = ...
String xxx = ...
String s = mt[xxx]; // mt.getXxx();

在基于索引或键设置值时,我们有JavaBeans中的List.set(),Map.put()和setXxx()。 我们可以通过三种方式解决此问题。

  1. 将设置方法添加到Map。
  2. 使用约定来查找set或put方法,并抱怨两者是否存在。
  3. 默认为set(),但添加一个注释,将其覆盖到put()中。
  4. 我们向所有集合添加新的特殊方法进行设置。

演示的最简单选择是编译器选择放置还是放置的位置,尽管这不太可能是最佳选择。

text[2] = "Hi"; // text.set(2, "Hi");map["Hello"] = "World"; // text.put("Hello", "World");mt[xxx] = "Updated"; // mt.setXxx("Updated");

添加操作

加法操作更有趣,因为可以结合使用。

List<Integer> nums =
AtomicInteger ai =nums += 5; // nums.add(5);ai += 5; // ai.addAndGet(5);nums[1] += 5; // is it thread safe?mt[xxx] += 5; // mt.addXxx(5);

最后一个示例的问题是,开发人员可能不知道对线程安全集合执行了不安全的操作。 如果将此映射到

nums.set(1, nums.get(1) + 5)); // not thread safe

这不是线程安全的。 相反,我们可以将其映射到lambda函数。

nums.update(1, x -> x + 5); // could be thread safe

底层的List可以使线程安全。

同样对于Map,您可以调用compute

map["Hello"] += " !!";

转换为:

map.compute("Hello", (k, v) -> v + " !!");

结论

只需很少更改现有代码,就可以添加对对象类型的操作员支持。 您可以使用现有的约定,尽管您可能会发现在某些情况下需要使用批注来更明确地控制它的工作方式。

翻译自: https://www.javacodegeeks.com/2015/09/custom-operators-for-collections-in-java.html

Java中集合的自定义运算符相关推荐

  1. java 自定义运算符_Java中集合的自定义运算符

    java 自定义运算符 总览 操作员重载有多种语言可用. Java对String类型的+运算符的支持对运算符的重载非常有限. 我们可以利用其他语言支持运算符的不同方式,但是我们可以在Java中实现一个 ...

  2. 怎么在java中创建一个自定义的collector

    文章目录 简介 Collector介绍 自定义Collector 总结 怎么在java中创建一个自定义的collector 简介 在之前的java collectors文章里面,我们讲到了stream ...

  3. c++中的new_怎么在java中创建一个自定义的collector

    简介 在之前的java collectors文章里面,我们讲到了stream的collect方法可以调用Collectors里面的toList()或者toMap()方法,将结果转换为特定的集合类. 今 ...

  4. java中collector使用_怎么在java中创建一个自定义的collector

    怎么在java中创建一个自定义的collector 简介 在之前的java collectors文章里面,我们讲到了stream的collect方法可以调用Collectors里面的toList()或 ...

  5. java中集合的排序

    java中集合的排序 import java.util.Set; import java.util.HashSet; import java.util.List; import java.util.A ...

  6. java中集合选取怎么选_集合中的可选

    java中集合选取怎么选 有时有人认为Optional类型值得在集合中使用. 据称,它解决了以下问题: HashMap在没有键映射以及值null映射到键的情况下返回null . 如果使用Map< ...

  7. java中集合判空_Java中的类型安全的空集合

    java中集合判空 我以前曾在Java Collections类的实用程序上进行过博客撰写,并且特别地在使用Usings Collections Methods上的博客emptyList(),empt ...

  8. 如下哪个是Java中的合法自定义标识符_吉大13春《面向对象程序设计》在线作业答案...

    吉大13春<面向对象程序设计>在线作业答案 2013-03-21 01:03:14 259 有学员问关于吉大13春<面向对象程序设计>在线作业答案的题目的参考答案和解析,具体如 ...

  9. Java中如何创建自定义的注解学习笔记(MD版)

    概要 Java中如何创建自定义的注解学习笔记(MD版). 博客 博客地址:IT老兵驿站. 前言 记得这篇笔记还是在泉州的龙玲酒店记录的,是一个周六的晚上,坐飞机从上海到泉州,从笔记中能勾起一些旅游的回 ...

最新文章

  1. SAP PM 初级系列20 - 维修工单的检验批
  2. linux cpu平均利用率st,理解 CPU 利用率
  3. 服务器对搜索引擎有哪些影响,实录:网站换服务器后对搜索引擎的影响
  4. hdu1247 Hat’s Words
  5. sql超低级用法(防遗忘)
  6. 什么是Kubernetes的CRI - 容器运行时接口
  7. NoSql理解+传统关系型数据库ACID+Nosql的CAP+BASE的理解
  8. mysql 优化300例_mysql的limit优化实例
  9. springcloud服务发现
  10. 《Python学习笔记》——南溪的python编程笔记
  11. Xna游戏编辑器开发(WinForm内嵌Xna)
  12. Android使用MediaRecorder和Camera实现视频录制及播放功能整理
  13. Linux学习笔记5-linux中的磁盘
  14. sqlserver高可用方案_PowerJob 的自实现高可用方案,妙妙妙
  15. C语言判断一个数是否为素数
  16. android之Fragment(官网资料翻译),高级Android开发必看
  17. 金融行业市场策划案例(共12份)
  18. 把手机自带计算机软件,怎样删除手机自带软件
  19. android设置左右声道音量,android控制左右声道实例
  20. 查看linux创建了哪些用户组,Linux查看用户属于哪些组/查看用户组下有哪些用户...

热门文章

  1. 多久没有给家里打过电话了?
  2. Redis(案例五:Set数据)
  3. Linux中安装nc(netcat)常见问题
  4. 二级MYSQL的语法整理_MySQL语法整理
  5. mysql duplicate key与replace into对比
  6. servlet session 跟踪用户上次访问时间
  7. 如何基于tomcat构建web站点
  8. tomcat(2)一个简单的servlet容器
  9. x86 的 TSS 任务切换机制
  10. stripe pay_J2Pay –实施网关