A recap of the evolution of Java starting with the JDK5 and finishing with the new api of date/time and lamdbas.
The code is in github (https://github.com/nhpatt/evolution_of_java), showing how to do it in Java 5 and 8.
3. State of the union
•
•
Currently in Java 7
o Luce has some projects working with Java 7
(ipamms, aernova…), the rest of them are Java 6.
Java 8 expected in spring 2014.
4. Java 5
•
September 2004 (old!, almost 9 years)
o Annotations
o Generics
OLDER JAVA
JAVA 5
List values = new ArrayList();
values.add("value 1");
values.add(3);
String value=(String) values.get(0);
String value2=(String) values.get(1);
List<String> values = new ArrayList<String>();
values.add("value 1");
values.add(new Integer(3));
String value= values.get(0);
Integer value1= values.get(1);
Compiled, but exception at runtime!!
compilation error
5. Java 5
o
Autoboxing/unboxing
JAVA 5
List<Integer> values = new ArrayList<Integer>();
values.add(3);
int value=values.get(0);
Integer value;
int primitive;
BOXING
UNBOXING
value=primitive;
primitive=value
;
o Enumerations:
With generics the type can’t be a
primitive, but is not a problem
Automatic operation
Special data type that enables for a variable to be a set of
predefined constants
6. public enum State{
INCOMPLETE("Incompl","YELLOW"),CORRECT("Correct","GREEN"), INCORRECT("Incorrect","RED");
private String name;
private String color;
private State(final String name, final String color) {
this.name = name;
this.color=color;
}
public String getName() {
return name;
private State state=State.CORRECT;
}
Assert.assertEquals("GREEN", state.getColor());
public String getColor() {
return color;
}
public static List<State> getStateValues() {
return Arrays.asList(INCOMPLETE, CORRECT,INCORRECT);
}
}
7. Java 5
o Static imports
OLDER JAVA
double r = Math.cos(Math.PI * theta);
JAVA 5
double r = Math.cos(PI * theta);
o Foreach
OLDER JAVA
JAVA 5
String result = "";
for (int i = 0; i < values.size(); i++) {
result += values.get(i) + "-";
}
String result = "";
for (final String value : values) {
result += value + "-";
}
8. Java 5
o Varargs
OLDER JAVA
JAVA 5
sumTwo(2, 2)); //two numbers
sumThree(2, 2, 2)); //three numbers
sum(2, 2)); //two numbers
sum(2, 2, 2)); //three numbers
public int sumTwo(final int a, final int b) {
return a + b;
}
public int sumThree(final int a, final int b,
final int c) {
return a + b + c;
}
public int sum(final int... numbers) {
int total = 0;
for (final int number :
numbers) {
total += number;
}
return total;
}
9. Java 6
•
December 2006
o No language changes
o Scripting support
o Improvements in Swing
o JDBC 4.0 support
o ...
10. Java 7
•
July 2011 (ok, now we are talking)
o JVM support for dynamic languages
o Binary integer literals/underscores
int num =
0b101
int million = 1_000_000
int telephone = 983_71_25_03
o
Varargs simplified
11. o Strings in switch
OLDER JAVA
STRINGS IN SWITCH - JAVA 7
public String getColor (final String state) {
if (("correct".equals(state)) {
return "green";
} else if("incorrect".equals(state)) {
return "red";
} else if ("incomplete".equals(state)){
return "yellow";
} else {
return "white";
}
}
public String getColor(final String state) {
switch (state) {
case "correct":
return "green";
case "incorrect":
return "red";
case "incomplete":
return "yellow";
default:
return "white";
}
}
12. OLDER JAVA
o
Automatic resource management in trypublic void newFile() {
catch
FileOutputStream fos = null;
DataOutputStream dos = null;
try {
fos = new
FileOutputStream("path.txt");
dos = new DataOutputStream(fos);
dos.writeBytes("prueba");
TRY WITH RESOURCES (ARM) - JAVA 7
} catch (final IOException e) {
public boolean newFile() {
e.printStackTrace();
try (FileOutputStream fos = new
} finally { // close resources
FileOutputStream("path.txt");
try {
DataOutputStream dos = new DataOutputStream(fos);)
dos.close();
{
fos.close();
dos.writeBytes("prueba");
} catch (final IOException e) {
dos.writeBytes("rn");
e.printStackTrace();
} catch (final IOException e) {
}
e.printStackTrace();
}
}
}
}
13. o Diamond Operator
OLDER JAVA
private Map<Integer, List<String>> createMapOfValues(final int... keys) {
final Map<Integer, List<String>> map = new HashMap<Integer,
List<String>>();
for (final int key : keys) {
map.put(key, getListOfValues());
private ArrayList<String> getListOfValues() {
}
return new ArrayList<String>(Arrays.asList("value1",
return map;
"value2"));
}
}
DIAMOND OPERATOR - JAVA 7
private Map<Integer, List<String>> createMapOfValues(final int... keys) {
final Map<Integer, List<String>> map = new HashMap<>();
for (final int key : keys) {
map.put(key, getListOfValues());
}
private ArrayList<String> getListOfValues() {
return map;
return new ArrayList<>(Arrays.asList("value1",
}
"value2"));
}
14. o Catch multiple exceptions
OLDER JAVA
public double divide() {
double result = 0d;
try {
int a = Integer.parseInt(num1);
int b = Integer.parseInt(num2);
result = a / b;
} catch (NumberFormatException ex1) {
System.out.println("invalid number");
} catch (ArithmeticException ex2) {
System.out.println("zero");
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
MULTI CATCH - JAVA 7
public double divide(){
double result = 0d;
try {
int a = Integer.parseInt(num1);
int b = Integer.parseInt(num2);
result = a / b;
} catch (NumberFormatException|ArithmeticException ex){
System.out.println("invalid number or zero");
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
15. Java 7
•
New File I/O
java.io.File
java.nio.file.Path
o Solves problems
o New methods to
manipulate files
Path path = Paths.get("C:Users/Pili/Documents/f.txt");
path.getFileName(); -> "f.txt"
path.getName(0); -> "Users"
path.getNameCount(); -> 4
path.subpath(0, 2); -> "Users/Pili"
path.getParent(); -> "C:Users/Pili/Documents"
path.getRoot(); -> "C:"
path.startsWith("C:Users"); -> true
for (final Path name : path) {
System.out.println(name);
}
16. new file
final File file = new File(path);
file.createNewFile();
new file
final Path file= Paths.get(path);
Files.createFile(file);
write file
write file
BufferedWriter bw = null;
try {
bw =new BufferedWriter(new FileWriter(file));
bw.write("Older Java: This is first line");
bw.newLine();
bw.write("Older Java: This is second line");
} catch (final IOException e) {
e.printStackTrace();
} finally {
try {
bw.close();
} catch (final IOException ex) {
System.out.println("Error");
}
}
try (BufferedWriter writer =
Files.newBufferedWriter(file,Charset.defaultCharset())
) {
writer.append("Java 7: This is first line");
writer.newLine();
writer.append("Java 7: This is second line");
} catch (final IOException exception) {
System.out.println("Error");
}
18. Java 8
•
Spring 2014?
o PermGen space disappears, new Metaspace
OutOfMemory errors disappear? -> not so fast
o
New methods in Collections (almost all lambdarelated)
o
Small changes everywhere (concurrency, generics,
String, File, Math)
20. Java 8
OLDER JAVA
public interface
CalculatorInterfacePreJava8 {
Integer add(Integer x, Integer y);
// WTF do u think you are doing?
// static Integer convert(Integer x);
JAVA 8
public interface
CalculatorInterfaceJava8 {
default Integer add(Integer x, Integer
y) {
return x + y;
}
}
static Integer convert(Integer x) {
return x * MAGIC_CONSTANT;
}
}
21. Java 8
•
new Date and Time API (joda inspired)
o
Current was based on currentTimeMillis, Date and
Calendar.
o
New one is based on continuous time and human
time.
o
Inmutable.
24. Java 8
•
Easier to add hours/days/… (plusDaysTest)
•
Easier to set date at midnight/noon (atStartOfDayTest)
•
Similar way to use instant time
•
Easier to format and ISO dates supported right-out-thebox
25. Java 8
•
How can I find the number of years between
two dates
•
Get next wednesday
•
Calculate flight time
42. Java 8
•
•
•
•
•
•
More expressive language
Generalization
Composability
Internal vs External iteration
Laziness & parallelism
Reusability
43. The Future?
•
•
2014 is right around the corner…
Java 9, 2016?
o Modularization (project Jigsaw)
o Money and Currency API
o Hope it is not this.
44. References
•
•
•
•
•
•
•
•
Examples in github
JDK 8 early access & eclipse with Java 8 support (+plugin)
Slides that inspired this talk
Quick survey of Java 7 features
Quick survey of Java 8 features
New Date and Time API
Good presentation of Java 8
There is even a book (wait, Java 8 isn’t live yet!)