posted on: 2015-05-24 13:22:02
A collection of stream examples that I will build up, and improve, over time.
So this first one is to take a comma separated string and get a list of integers.
String s = "1,2,3,4,5";
List<Integer> ints = Arrays.stream(
s.split(",")
).map(
Integer::new
).collect(
Collectors.toList()
);
Read a file and split all of the lines of tab separated values.
List<double[]> values = Files.lines(
f.toPath(), Charset.forName("UTF-8")
).filter((l)->!l.startsWith("#")).map(
(l) -> Arrays.stream(
l.split("\\t")
).mapToDouble(Double::parseDouble).toArray()
).filter((v)->v.length>0).collect(Collectors.toCollection(ArrayList::new));
Create a set of double[]s for a range of values.
List<double[]> op = IntStream.range(0, bins).mapToObj(
(i)->new double[]{(i+0.5)*delta + min, 0}
).collect(Collectors.toCollection(ArrayList::new));
Broken example of steam usage because the stream is lazy. In this example amax and amin will not get set until the stream is consumed. This is broken then because, I want to use the values when I consume the stream!
final AtomicDouble amax = new AtomicDouble(-Double.MAX_VALUE);
final AtomicDouble amin = new AtomicDouble(Double.MAX_VALUE);
DoubleStream sv = values.stream().mapToDouble(
(v) ->{
double r = v[index];
amax.setIfGreater(r);
amin.setIfLess(r);
return r;
}
);
To improve this the we should switch to using two streams with a forEach.
final AtomicDouble amax = new AtomicDouble(-Double.MAX_VALUE);
final AtomicDouble amin = new AtomicDouble(Double.MAX_VALUE);
values.forEach(
(v) ->{
double r = v[index];
amax.setIfGreater(r);
amin.setIfLess(r);
});
DoubleStream sv = values.stream().mapToDouble(
(v) ->{
double r = v[index];
return r;
});
Or even better, just use a summary statistics class.
DoubleSummaryStatistics stats = Arrays.stream(values).summaryStatistics()
double min = stats.getMin();
double max = stats.getMax();
Comments
create comment?