JDK8/Streams are cool? Here is the answer. ;-)
Today I was preparing a few slides for my next JUG talk.
For this if started with a normal piece of code like the following.
public List<List<Integer>> generateDemoValueMatrix() {
final List<List<Integer>> resultMatrix = new ArrayList<>();
final Random random = new Random();
for(int anzahlKurven = 0; anzahlKurven <ANZAHL_KURVEN; anzahlKurven++){
final List<Integer> result = new ArrayList<>();
for (int i = 0; i < 10; i++) {
final int nextInt = random.nextInt(100);
result.add(nextInt);
}
resultMatrix.add(result);
}
return resultMatrix;
}
Next step would be the creation of two methods...
public List<List<Integer>> generateDemoValueMatrix() {
final List<List<Integer>> result = new ArrayList<>();
for(int anzahlKurven = 0; anzahlKurven <ANZAHL_KURVEN; anzahlKurven++){
final List<Integer> demoValuesForY = generateDemoValuesForY();
result.add(demoValuesForY);
}
return result;
}
public List<Integer> generateDemoValuesForY() {
final Random random = new Random();
final List<Integer> result = new ArrayList<>();
for (int i = 0; i < 10; i++) {
final int nextInt = random.nextInt(100);
result.add(nextInt);
}
return result;
}
Ok, look´s like always... booooring.... So I started with Streams..
public List<List<Integer>> generateDemoValueMatrix() {
return Stream
.generate(this::generateDemoValuesForY)
.limit(ANZAHL_KURVEN)
.collect(Collectors.toList());
}
public List<Integer> generateDemoValuesForY(){
final Random random = new Random();
return Stream
.generate(() -> {
return random.nextInt(100);
})
.limit(10)
.collect(Collectors.toList());
}
Not really better.. only new syntax.. now reducing the syntax..
public List<List<Integer>> generateDemoValueMatrix() {
return Stream
.generate(this::generateDemoValuesForY)
.limit(ANZAHL_KURVEN)
.collect(Collectors.toList());
}
public List<Integer> generateDemoValuesForY(){
final Random random = new Random();
return Stream
.generate(() -> random.nextInt(100))
.limit(10)
.collect(Collectors.toList());
}
But Random offer something new.
public List<List<Integer>> generateDemoValueMatrix() {
return Stream
.generate(this::generateDemoValuesForY)
.limit(ANZAHL_KURVEN)
.collect(Collectors.toList());
}
public List<Integer> generateDemoValuesForY(){
return new Random()
.ints(0, 100)
.limit(10)
.boxed()
.collect(Collectors.toList());
}
Combining both methods..
public List<List<Integer>> generateDemoValueMatrix() {
final Random random = new Random();
return Stream.generate(
() -> Stream.generate(
() -> random.nextInt(100))
.limit(10)
.collect(Collectors.toList())
)
.limit(ANZAHL_KURVEN)
.collect(Collectors.toList());
}
OK, not short enough.. we could it better..
public List<List<Integer>> generateDemoValueMatrix() {
return Stream.generate(
() -> new Random()
.ints(0, 100)
.limit(10)
.boxed()
.collect(Collectors.toList())
).limit(ANZAHL_KURVEN)
.collect(Collectors.toList());
}
Uuuppsss.. static imports possible.. ;-)
public List<List<Integer>> generateDemoValueMatrix() {
return generate(() -> new Random()
.ints(0, 100)
.limit(10).boxed().collect(toList())
).limit(ANZAHL_KURVEN).collect(toList());
}
Now compare with the first and decide ;-) Streams are cool ? I think so!!
Kommentare
Kommentar veröffentlichen