defaultgroovymethods.java
来自「Groovy动态语言 运行在JVM中的动态语言 可以方便的处理业务逻辑变化大的业」· Java 代码 · 共 1,794 行 · 第 1/5 页
JAVA
1,794 行
* @param closure a closure
* @return the last value of the last iteration
*/
public static Object inject(Object[] self, Object value, Closure closure) {
Object[] params = new Object[2];
for (int i = 0; i < self.length; i++) {
params[0] = value;
params[1] = self[i];
value = closure.call(params);
}
return value;
}
/**
* Sums a collection of numeric values. <code>coll.sum()</code> is equivalent to:
* <code>coll.inject(0) {value, item -> value + item}</code>.
*
* @param self Collection of values to add together.
* @return The sum of all of the list itmems.
*/
public static Object sum(Collection self) {
Object result = null;
if (self.size() == 0) return result;
boolean isNumber = true;
Class classref = null;
try {
classref = Class.forName("java.lang.Number");
} catch (Exception ex) {
}
for (Iterator iter = self.iterator(); iter.hasNext();) {
if (!classref.isInstance(iter.next())) {
isNumber = false;
break;
}
}
if (isNumber) {
result = new Integer(0);
} else {
result = new String();
}
Object[] param = new Object[1];
for (Iterator iter = self.iterator(); iter.hasNext();) {
param[0] = iter.next();
MetaClass metaClass = InvokerHelper.getMetaClass(result);
result = metaClass.invokeMethod(result, "plus", param);
}
return result;
}
/**
* Sums the result of apply a closure to each item of a collection.
* <code>coll.sum(closure)</code> is equivalent to:
* <code>coll.collect(closure).sum()</code>.
*
* @param self a Collection
* @param closure a single parameter closure that returns a numeric value.
* @return The sum of the values returned by applying the closure to each
* item of the list.
*/
public static Object sum(Collection self, Closure closure) {
Object result = new Integer(0);
Object[] closureParam = new Object[1];
Object[] plusParam = new Object[1];
for (Iterator iter = self.iterator(); iter.hasNext();) {
closureParam[0] = iter.next();
plusParam[0] = closure.call(closureParam);
MetaClass metaClass = InvokerHelper.getMetaClass(result);
result = metaClass.invokeMethod(result, "plus", plusParam);
}
return result;
}
/**
* Concatenates all of the items of the collection together with the given String as a separator
*
* @param self a Collection of objects
* @param separator a String separator
* @return the joined String
*/
public static String join(Collection self, String separator) {
StringBuffer buffer = new StringBuffer();
boolean first = true;
if (separator == null) separator = "";
for (Iterator iter = self.iterator(); iter.hasNext();) {
Object value = iter.next();
if (first) {
first = false;
} else {
buffer.append(separator);
}
buffer.append(InvokerHelper.toString(value));
}
return buffer.toString();
}
/**
* Concatenates all of the elements of the array together with the given String as a separator
*
* @param self an array of Object
* @param separator a String separator
* @return the joined String
*/
public static String join(Object[] self, String separator) {
StringBuffer buffer = new StringBuffer();
boolean first = true;
if (separator == null) separator = "";
for (int i = 0; i < self.length; i++) {
String value = InvokerHelper.toString(self[i]);
if (first) {
first = false;
} else {
buffer.append(separator);
}
buffer.append(value);
}
return buffer.toString();
}
/**
* Selects the maximum value found in the collection
*
* @param self a Collection
* @return the maximum value
*/
public static Object max(Collection self) {
Object answer = null;
for (Iterator iter = self.iterator(); iter.hasNext();) {
Object value = iter.next();
if (value != null) {
if (answer == null || ScriptBytecodeAdapter.compareGreaterThan(value, answer)) {
answer = value;
}
}
}
return answer;
}
/**
* Selects the maximum value found in the collection using the given comparator
*
* @param self a Collection
* @param comparator a Comparator
* @return the maximum value
*/
public static Object max(Collection self, Comparator comparator) {
Object answer = null;
for (Iterator iter = self.iterator(); iter.hasNext();) {
Object value = iter.next();
if (answer == null || comparator.compare(value, answer) > 0) {
answer = value;
}
}
return answer;
}
/**
* Selects the minimum value found in the collection
*
* @param self a Collection
* @return the minimum value
*/
public static Object min(Collection self) {
Object answer = null;
for (Iterator iter = self.iterator(); iter.hasNext();) {
Object value = iter.next();
if (value != null) {
if (answer == null || ScriptBytecodeAdapter.compareLessThan(value, answer)) {
answer = value;
}
}
}
return answer;
}
/**
* Selects the minimum value found in the collection using the given comparator
*
* @param self a Collection
* @param comparator a Comparator
* @return the minimum value
*/
public static Object min(Collection self, Comparator comparator) {
Object answer = null;
for (Iterator iter = self.iterator(); iter.hasNext();) {
Object value = iter.next();
if (answer == null || comparator.compare(value, answer) < 0) {
answer = value;
}
}
return answer;
}
/**
* Selects the minimum value found in the collection using the given closure as a comparator
*
* @param self a Collection
* @param closure a closure used as a comparator
* @return the minimum value
*/
public static Object min(Collection self, Closure closure) {
int params = closure.getMaximumNumberOfParameters();
if (params == 1) {
Object answer = null;
Object answer_value = null;
for (Iterator iter = self.iterator(); iter.hasNext();) {
Object item = iter.next();
Object value = closure.call(item);
if (answer == null || ScriptBytecodeAdapter.compareLessThan(value, answer_value)) {
answer = item;
answer_value = value;
}
}
return answer;
} else {
return min(self, new ClosureComparator(closure));
}
}
/**
* Selects the maximum value found in the collection using the given closure as a comparator
*
* @param self a Collection
* @param closure a closure used as a comparator
* @return the maximum value
*/
public static Object max(Collection self, Closure closure) {
int params = closure.getMaximumNumberOfParameters();
if (params == 1) {
Object answer = null;
Object answer_value = null;
for (Iterator iter = self.iterator(); iter.hasNext();) {
Object item = iter.next();
Object value = closure.call(item);
if (answer == null || ScriptBytecodeAdapter.compareLessThan(answer_value, value)) {
answer = item;
answer_value = value;
}
}
return answer;
} else {
return max(self, new ClosureComparator(closure));
}
}
/**
* Makes a String look like a Collection by adding support for the size() method
*
* @param text a String
* @return the length of the String
*/
public static int size(String text) {
return text.length();
}
/**
* Provide standard Groovy size() method for StringBuffers
*
* @param buffer a StringBuffer
* @return the length of the StringBuffer
*/
public static int size(StringBuffer buffer) {
return buffer.length();
}
/**
* Provide the standard Groovy size method
*/
public static long size(File file) {
return file.length();
}
/**
* Provide the standard Groovy size method
*/
public static long size(Matcher matcher) {
return getCount(matcher);
}
/**
* Makes an Array look like a Collection by adding support for the size() method
*
* @param self an Array of Object
* @return the size of the Array
*/
public static int size(Object[] self) {
return self.length;
}
/**
* Support the subscript operator for String.
*
* @param text a String
* @param index the index of the Character to get
* @return the Character at the given index
*/
public static CharSequence getAt(CharSequence text, int index) {
index = normaliseIndex(index, text.length());
return text.subSequence(index, index + 1);
}
/**
* Support the subscript operator for String
*
* @param text a String
* @return the Character object at the given index
*/
public static String getAt(String text, int index) {
index = normaliseIndex(index, text.length());
return text.substring(index, index + 1);
}
/**
* Support the range subscript operator for CharSequence
*
* @param text a CharSequence
* @param range a Range
* @return the subsequence CharSequence
*/
public static CharSequence getAt(CharSequence text, Range range) {
int from = normaliseIndex(DefaultTypeTransformation.intUnbox(range.getFrom()), text.length());
int to = normaliseIndex(DefaultTypeTransformation.intUnbox(range.getTo()), text.length());
// If this is a backwards range, reverse the arguments to substring.
if (from > to) {
int tmp = from;
from = to;
to = tmp;
}
return text.subSequence(from, to + 1);
}
/**
* Support the range subscript operator for CharSequence or StringBuffer with IntRange
*
* @param text a CharSequence
* @param range an IntRange
* @return the subsequence CharSequence
*/
public static CharSequence getAt(CharSequence text, IntRange range) {
return getAt(text, (Range) range);
}
/**
* Support the range subscript operator for String with IntRange
*
* @param text a String
* @param range an IntRange
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?