docs: @Override
  	public double integrate(DoubleUnaryOperator integrand) {
  		double	lowerBound			= getLowerBound();
  		double	upperBound			= getUpperBound();
  		double	range				= upperBound-lowerBound;
  		int		numberOfIntervalls	= (int) ((numberOfEvaluationPoints-1) / 2.0);
  
  		double fullIntervall = range / numberOfIntervalls;
  		double halfIntervall = 0.5 * fullIntervall;
  
  		IntStream intervals = IntStream.range(1, numberOfIntervalls);
  		if(useParallelEvaluation) {
  			intervals = intervals.parallel();
  		}
  
  		double sum = intervals.mapToDouble(
  				new IntToDoubleFunction() {
  					@Override
  					public double applyAsDouble(int i) {
  						return 2 * integrand.applyAsDouble(lowerBound + i * fullIntervall + halfIntervall) + integrand.applyAsDouble(lowerBound + i * fullIntervall);
  					}
  				}
  				).sum();
  
  		sum += 2.0 * integrand.applyAsDouble(lowerBound + halfIntervall);
  
  		return (integrand.applyAsDouble(lowerBound) + integrand.applyAsDouble(upperBound) + 2.0 * sum) / 6.0 * fullIntervall;
  	}