I am trying to learn lambda expression but, I could not understand what is happening in this example code.
The author is trying to explain about method chaining,
import java.util.stream.Stream;
import java.util.function.Function;
import java.awt.Color;
import java.util.function.Consumer;
class Camera {
private Function<Color, Color> filter;
public Color capture(final Color inputColor) {
final Color processedColor = filter.apply(inputColor);
// ... more processing of color...
return processedColor;
}
// ... other functions that use the filter ...
public void setFilters(final Function<Color, Color>... filters) {
filter = Stream.of(filters).reduce((filter, next) -> filter.compose(next)).orElse(color -> color);
}
public Camera() {
setFilters();
}
public static void main(final String[] args) {
final Camera camera = new Camera();
final Consumer<String> printCaptured = (filterInfo) -> System.out
.println(String.format("with %s: %s", filterInfo, camera.capture(new Color(200, 100, 200))));
System.out.println("//" + "START:NOFILTER_OUTPUT");
printCaptured.accept("no filter");
System.out.println("//" + "END:NOFILTER_OUTPUT");
System.out.println("//" + "START:BRIGHT_OUTPUT");
camera.setFilters(Color::brighter);
printCaptured.accept("brighter filter");
System.out.println("//" + "END:BRIGHT_OUTPUT");
System.out.println("//" + "START:DARK_OUTPUT");
camera.setFilters(Color::darker);
printCaptured.accept("darker filter");
System.out.println("//" + "END:DARK_OUTPUT");
System.out.println("//" + "START:BOTH_OUTPUT");
camera.setFilters(Color::brighter, Color::darker);
printCaptured.accept("brighter & darker filter");
System.out.println("//" + "END:BOTH_OUTPUT");
}
}
Now let us consider this line: camera.setFilters(Color::brighter);
Here we get an RGB value and that is passed on the setFilters method and a stream object is created for that color. And for function to be processed there should be an apply method defined for that function and I am not knowing what is happening. Could someone please explain.