
Point largest = Stream.of(points)
.filter(Points::isShort)
.max(Comparator.comparingInt(Points::lengthSquared))
.orElseThrow();
Point largest = points.get(0);
for (int i = 1; i < points.size(); i++) {
Point p = points.get(i);
if (Points.isShort(p)) {
if (Points.lengthSquared(p) > Points.lengthSquared(largest))
largest = p;
}
}
static int numberOfBrickWithChildrenWithAtLeastTwoParents(String input) {
var grid = new HashMap<Pos, Level>();
return input.lines()
.map(l -> {
var array = Arrays.stream(l.split(",|~")).mapToInt(Integer::parseInt).toArray();
return new Brick(array[0], array[3], array[1], array[4], array[2], array[5]);
})
.collect(groupingBy(Brick::z1, TreeMap::new, toList()))
.values().stream()
.flatMap(List::stream)
.map(brick -> {
var onTop = brick.positions()
.map(pos -> grid.getOrDefault(pos, new Level(null, 0)))
.collect(groupingBy(Level::z, TreeMap::new, flatMapping(l -> Stream.ofNullable(l.brick), toSet())))
.lastEntry();
var level = new Level(brick, 1 + brick.z2 - brick.z1 + onTop.getKey());
brick.positions().forEach(pos -> grid.put(pos, level));
return new Pair<>(brick, onTop.getValue());
})
.collect(teeing(
toMap(Pair::u, pair -> pair.v().size()),
flatMapping(pair -> pair.v().stream().map(b -> new Pair<>(b, pair.u())),
groupingBy(Pair::u, mapping(Pair::v, toList()))),
(parentMap, childrenMap) ->
(int) parentMap.keySet().stream()
.filter(parent -> childrenMap.getOrDefault(parent, List.of()).stream()
.allMatch(child -> parentMap.get(child) > 1))
.count()
));
}
Source Rémi Forax | Advent of Code 2023 Day 22

state.randomPointArray, comparing
List<Point> points = List.of(state.randomPointArray);
Point largest = points.get(0);
for (int i = 1; i < points.size(); i++) {
Point p = points.get(i);
if (Points.isShort(p)) {
if (Points.lengthSquared(p) > Points.lengthSquared(largest))
largest = p;
}
}
with
Point largest = Stream.of(state.randomPointArray)
.filter(Points::isShort)
.max(Comparator.comparingInt(Points::lengthSquared))
.orElseThrow();
FilterMaxBenchmark.withCollection avgt 100 355.147 ± 3.803 ms/op FilterMaxBenchmark.withStream avgt 100 205.245 ± 2.769 ms/op
List.of makes a copy?points.get[i]:
FilterMaxBenchmark.withArray avgt 100 178.251 ± 2.087 ms/op FilterMaxBenchmark.withStream avgt 100 205.245 ± 2.769 ms/op
FilterMapDemo, set breakpoint to .filter(...)new StatelessOp<>(...).accept method of sink..map(...)new StatelessOp<>(...). Look at accept method.Image created with https://imagetodrawio.com
AbstractPipeline.copyInto (line 566)spliterator.forEachRemaining(wrappedSink);
forEachRemainingaction.accept: First pipeline stage checks the filter predicatedownstream.accept(u) and resume (F9)ReducingSink accepts the element, updating the maximum.limit(5) after the map:AbstractPipeline.copyInto. As before, set a breakpoint into line 566copyIntoWithCancel)forEachWithCancel
boolean cancelled;
do { } while (!(cancelled = sink.cancellationRequested()) && spliterator.tryAdvance(sink));
return cancelled;
StreamOpFlag.SHORT_CIRCUIT
hsdis-amd64.so from https://www.chriswhocodes.com/hsdis/ into path/to/lib directoryexport LD_LIBRARY_PATH=path/to/lib
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:+LogCompilation \
-XX:LogFile=jitwatch.log -cp target/classes/ --enable-preview \
com.horstmann.streams.demos.FilterMapDemo 10000
export GDK_SCALE=2 java --enable-preview -jar jitwatch-ui-1.4.9-shaded-linux-x64.jar

Point largest = Stream.of(randomPointArray)
.parallel()
.filter(Points::isShort)
.map(Points::lengthSquared)
.max(Integer::compare)
.orElseThrow();
ConcurrentBenchmark1.withParallelStream avgt 100 19.082 ± 0.212 ms/op ConcurrentBenchmark1.withSerialStream avgt 100 203.989 ± 3.187 ms/op
long result = Stream.of(state.randomPointArray)
.parallel()
.mapToLong(p -> (long) p.x * p.x + (long) p.y * p.y)
.filter(p -> p < Integer.MAX_VALUE)
.limit(ITERATIONS / 10)
.min()
.orElseThrow();
ConcurrentBenchmark2.withParallelStream avgt 100 27.127 ± 1.876 ms/op ConcurrentBenchmark2.withSerialStream avgt 100 10.579 ± 0.339 ms/op
long result = Stream.of(state.randomPointArray)
.parallel()
.unordered()
...
gather for intermediate operationsIntStream.range(0, 10).boxed().gather(Gatherers.windowFixed(4)).toList()
// [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9]]
IntStream.range(0, 10).boxed().gather(Gatherers.windowSliding(4)).toList()
// [[0, 1, 2, 3], [1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6], [4, 5, 6, 7], [5, 6, 7, 8], [6, 7, 8, 9]]
Integer[] digits = { 1, 7, 2, 9 };
Stream.of(digits).gather(Gatherers.scan(() -> 0, (x, y) -> x * 10 + y)) // [1, 17, 172, 1729]
Stream.of(digits).gather(Gatherers.fold(() -> 0, (x, y) -> x * 10 + y)) // [1729]
mapConcurrentâsee belowstatic <T> Gatherer<T, ?, Map.Entry<Long, T> zipWithIndex() {
class Index { long index = 0; }
return Gatherer.ofSequential(
Index::new,
Gatherer.Integrator.ofGreedy((state, element, downstream) ->
return downstream.push(Map.Entry(state.index++, element))));
}
Gatherer.ofSequential/Gatherer.ofwindowSliding, zipWithIndexGatherer.Integrator.ofGreedy/Gatherer.Integrator.offorEachRemaining, must check for cancellationvar result = listOfIntegers.parallelStream()
.map(...)
.gather(mapSequential(...))
.toList();
Benchmark Mode Cnt Score Error Units MyBenchmark.parallelThenParallelizableGreedy avgt 25 396.633 ± 9.675 us/op MyBenchmark.parallelThenParallelizablePicky avgt 25 425.897 ± 17.134 us/op MyBenchmark.parallelThenSequentialGreedy avgt 25 771.995 ± 14.370 us/op MyBenchmark.parallelThenSequentialPicky avgt 25 1739.768 ± 74.636 us/op MyBenchmark.serialThenParallelizableGreedy avgt 25 1028.898 ± 15.994 us/op MyBenchmark.serialThenParallelizablePicky avgt 25 1026.294 ± 10.314 us/op MyBenchmark.serialThenSequentialGreedy avgt 25 1039.664 ± 20.719 us/op MyBenchmark.serialThenSequentialPicky avgt 25 1084.909 ± 30.541 us/op
String task(int i) {
try {
Thread.sleep(1000);
} catch (InterruptedException _) {
}
return i + " " + Thread.currentThread().toString();
}
IntStream.range(0, 60).mapToObj(this::task).toList()
IntStream.range(0, 60).parallel().mapToObj(this::task).toList()
mapConcurrent: 1 second
IntStream.range(0, 60).boxed().gather(Gatherers.mapConcurrent(60, this::task)).toList()
