介绍
如何在Java 6中编写公共静态 range方法或Range类,以至少覆盖其他编程语言中实现的常见功能?
如果您想回答这个问题,那么您可以忽略以下内容。
关于
我时不时地会错过其他语言具有的功能。我对自己编写的任何语言都有不同的编码风格,而且我不愿意改变这个习惯。因此,如果我想重用在不同语言中编写的算法,则必须进行烦人的小技巧或解决方法,以涵盖缺失的功能。我想找到永久有效和高效的range()
修复方法。
对我来说- range()
方法以可能是懒惰的方式返回输入范围,并具有默认值。在任何时候,它都有一个开始,结束条件和获取下一个元素的方法。它应该在for each循环内外完美工作。
备注
我真的希望不使用任何外部库,除了Google Guava或等效库。通过等效库,我指的是经过适当测试,与JDK完美配合且不被视为已弃用的代码。
可能不太清楚,因此:
- 通过
如何编写
,我指-您不必编写它,只需描述常见陷阱以及推荐方法的优缺点。 - 这是
循环代码
,但也可以使用 - 这不是作业:P
除了整数输入是最常用的功能外,我真的希望它能够很好地与类实例(如BigInteger和Joda DateTime)一起使用。
想法
- 必须能够在
for-each
循环中使用 - 通用,但类型安全
- 可以使用预先存在的容器方法,例如:.cycle()、.filter()、.all()、.any()、transform()
作为一个方法,range()
头可能是这样的:
/**TODO: Think about why / how to add step, limit, offset and cycle detection. */
public static <T extends Comparable<T>> Iterable<T> //
range(T from, Predicate<T> to, Function<T, T> fNext) //
throws NullPointerException, IllegalArgumentException {
基于个人偏好,我使用 Builder 模式实现了 Range
。
编辑
Range
的实现在各个语言中存在差异,包括Scala、Python 3、Groovy、.Net(使用 linq)[c#,f#,vb 和 c ++] 、ruby、PHP等。
这里我也可以添加一个示例,展示我打算如何改进(simple sample case)。
public static <T extends Comparable<T>> Iterable<T> //
range(T from, Predicate<T> to, Function<T, T> fNext) //
throws NullPointerException {
Preconditions.checkNotNull(from);
Preconditions.checkNotNull(to);
Preconditions.checkNotNull(fNext);
T current = from;
ArrayList<T> result = Lists.newArrayList();
if (to.apply(current)) result.add(current);
while (to.apply(current = Preconditions.checkNotNull(fNext.apply(current))))
result.add(current);
return result;
}
或者懒人选择
//eats first element
public static <T extends Comparable<T>> Iterator<T> //
range2(final T from, final Predicate<T> to, final Function<T, T> fNext)
throws NullPointerException, UnsupportedOperationException {
Preconditions.checkNotNull(from);
Preconditions.checkNotNull(to);
Preconditions.checkNotNull(fNext);
return new Iterator<T>() {
T current = from;
@Override public boolean hasNext() {return to.apply(current);}
@Override public T next() {return current = Preconditions.checkNotNull(fNext.apply(current));}
@Override public void remove() {throw new UnsupportedOperationException();}
};
}
range
中想要的内容进行了假设。如果您能指出特定语言和/或指向另一种语言/库的range
关键字/类/方法/API的文档,那将会很有帮助。 - Bert F