int[] array = {1, 2, 3};
What I learned from the book Core Java for the Impatient
TweetPosted on Friday Jun 19, 2015 at 06:07PM in Java
I’m reading a book named Core Java for the Impatient. I leave some notes that what I learned from that book.
Array construction
You can omit the new int[]
statement when you declare a variable as follows:
You can’t omit it when you don’t declare a variable at the same time (in other words, when you use an existing variable).
For example, the following is illegal:
int[] array; array = {2, 3, 4};
You need to write like the following instead:
int[] array; array = new int[]{2, 3, 4};
NumberFormat
The NumberFormat
class provides some useful text formatting functions for numeric variables.
Currency formatting
final BigDecimal val1 = new BigDecimal("0.126"); final NumberFormat currencyInstance = NumberFormat.getCurrencyInstance(Locale.US); System.out.println(currencyInstance.format(val1));
Yields:
$0.13
Percentage formatting
final BigDecimal val2 = new BigDecimal("0.126"); final NumberFormat percentInstance = NumberFormat.getPercentInstance(Locale.US); System.out.println(percentInstance.format(val2));
Yields:
13%
They automatically adds the symbol and round up on 6 and round down on 5.
Wildcard for the classpath
Consider a class which depends on the class corejava.jar1.Foo
and corejava.jar2.Bar
:
package corejava.classpath; public class Main { public static void main(String[] args) { System.out.println(new corejava.jar1.Foo()); System.out.println(new corejava.jar2.Bar()); } }
You have these classes in separated three jar files in the /tmp/jar
directory as follows:
$ ls -l /tmp/jar total 24 -rw-r--r-- 1 kyle wheel 2192 Jun 19 16:06 classpath-1.0-SNAPSHOT.jar -rw-r--r-- 1 kyle wheel 1962 Jun 19 16:04 jar1-1.0-SNAPSHOT.jar -rw-r--r-- 1 kyle wheel 1962 Jun 19 16:04 jar2-1.0-SNAPSHOT.jar
In this setup, you can specify all of three jar files with the wildcard *
as follows:
$ java -cp '/tmp/jar/*' corejava.classpath.Main corejava.jar1.Foo@511d50c0 corejava.jar2.Bar@5e2de80c
Note that you can’t use complex wildcard that smarter UNIX shells recognize. in other words, it doesn’t recognize patterns like *.jar
. for example, the following command won’t work:
$ java -cp '/tmp/jar/*.jar' corejava.classpath.Main Error: Could not find or load main class corejava.classpath.Main
Including an image to javadoc
Consider you have a class named Dog
in a Maven project. you want to include an image of a dog named chihuahua.jpg
to the javadoc of the class. in such case you can write the class as follows:
package corejava.main; /** * The class represents a dog. <br> <img src="doc-files/chihuahua.jpg" alt="a cute chihuahua dog"> */ public class Dog { /** * The dog will say woof. */ public void bark() { System.out.println("Woof!"); } }
Next, put the chihuahua.jpg
in src/main/javadoc/corejava/main/doc-files
. structure under the src/main
will be:
. |-- java | `-- corejava | `-- main | `-- Dog.java |-- javadoc | `-- corejava | `-- main | `-- doc-files | `-- chihuahua.jpg `-- resources
Then execute mvn javadoc:javadoc
in the top of the project directory. javadoc will be produced in the target/site/apidocs
directory. open index.html
in that directory and go to the documentation of Dog
class, you will see the image of a dog as follows:
Including a link to relevant part of javadoc
Consider you have a class named Cat
:
package corejava.main; /** * Represents a cat. */ public class Cat { /** * The cat starts meowing. * * @see corejava.main.Dog#bark() * */ public void meow() { System.out.println("Meow!"); } }
This produces the following javadoc:
There are some of more useful syntaxes such as link to external URLs.
Method references
The following three statements produce identical Comparator
:
Comparator<String> c1 = new Comparator<String>() { @Override public int compare(String x, String y) { return x.compareTo(y); } }; Comparator<String> c2 = (x, y) -> x.compareTo(y); Comparator<String> c3 = String::compareTo;
Constructor references
Constructor references are useful with Streams. consider you have a class named Dog
:
public class Dog { private String name; public Dog(String name) { this.name = name; } public String getName() { return name; } @Override public String toString() { return "Dog{" + "name='" + name + '\'' + '}'; } }
You can convert a List<String>
that contains name of dogs to a Stream<Dog>
as follows:
List<String> dogs = Arrays.asList("Snoopy", "Spike", "Olaf"); Stream<Dog> dogStream = dogs.stream().map(Dog::new);
If you need to create a typed array from that Stream<Dog>
, you can use following idiom:
Dog[] dogArray = dogStream.toArray(Dog[]::new);
Tags: book