Java中集合的自定义运算符

总览

操作员重载有多种语言可用。 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值