I have a HTML list of about 500 items and a "filter" box above it. I started by using jQuery to filter the list when I typed a letter (timing code added later): $('#filter').keyup( function() { var jqStart = (new Date).getTime(); var search = $(this).val().toLowerCase(); var $list = $('ul.ablist > li'); $list.each( function() { if ( $(this).text().toLowerCase().indexOf(search) === -1 ) $(this).hide(); else $(this).show(); } ); console.log('Time: ' + ((new Date).getTime() - jqStart)); } ); However, there was a couple of seconds delay after typing each letter (particularly the first letter). So I thought it may be slightly quicker if I used plain Javascript (I read recently that jQuery's each function is particularly slow). Here's my JS equivalent: document.getElementById('filter').addEventListener( 'keyup', function () { var jsStart = (new Date).getTime()...
varargs could do that (in a way). Other than that, all variables in the declaration of the method must be supplied. If you want a variable to be optional, you can overload the method using a signature which doesn't require the parameter.
ReplyDeleteprivate boolean defaultOptionalFlagValue = true;
public void doSomething(boolean optionalFlag) {
...
}
public void doSomething() {
doSomething(defaultOptionalFlagValue);
}
You can use something like this:
ReplyDeletepublic void addError(String path, String key, Object... params) {
}
The params variable is optional. It is treated as a nullable array of Objects.
Strangely, I couldn't find anything about this in the documentation, but it works!
This is "new" in Java 1.5 and beyond (not supported in Java 1.4 or earlier).
I see user bhoot mentioned this too below.
Unfortunately Java doesn't support default parameters directly.
ReplyDeleteHowever, I've written a set of JavaBean annotations, and one of them support default parameters like the following:
protected void process(
Processor processor,
String item,
@Default("Processor.Size.LARGE") Size size,
@Default("red") String color,
@Default("1") int quantity) {
processor.process(item, size, color, quantity);
}
public void report(@Default("Hello") String message) {
System.out.println("Message: " + message);
}
The annotation processor generates the method overloads to properly support this.
See http://code.google.com/p/javadude/wiki/Annotations
Full example at http://code.google.com/p/javadude/wiki/AnnotationsDefaultParametersExample
There are no optional parameters in Java. What you can do is overloading the functions and then passing default values.
ReplyDeletevoid SomeMethod(int age, String name) {
//
}
// Overload
void SomeMethod(int age) {
SomeMethod(age, "John Doe");
}
VarArgs and overloading have been mentioned. Another option is a Builder pattern, which would look something like this:
ReplyDeleteMyObject my = new MyObjectBuilder().setParam1(value)
.setParam3(otherValue)
.setParam6(thirdValue)
.build();
Although that pattern would be most appropriate for when you need optional parameters in a constructor.
There is optional parameters with Java 1.5 onwards I think. Just declare your function like this:
ReplyDeletepublic void doSomething(boolean...optionalFlag) {
...
}
you could call with doSomething() or doSomething(true) now.
It would depends on what you want to achieve, varargs or method overloading should solve most scenarios.
ReplyDeleteHere some nice examples of how to use them:
http://blog.sleekface.com/in/java-core/method-with-optional-parameters/
but keep in mind not to over use method overloading. it brings confusion.