diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ZipfDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ZipfDistribution.java
index 95c955e..60e0261 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ZipfDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/ZipfDistribution.java
@@ -134,9 +134,8 @@
         final double s = getExponent();
 
         final double Hs1 = generalizedHarmonic(N, s - 1);
-        final double Hs = nthHarmonic;
 
-        return Hs1 / Hs;
+        return Hs1 / nthHarmonic;
     }
 
     /**
diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/AbstractContinuousDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/AbstractContinuousDistributionTest.java
index 059a0bb..92e5a9a 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/AbstractContinuousDistributionTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/AbstractContinuousDistributionTest.java
@@ -147,13 +147,7 @@
 
             @Override
             public double getMean() {
-                final UnivariateFunction f = new UnivariateFunction() {
-
-                    @Override
-                    public double value(final double x) {
-                        return x * density(x);
-                    }
-                };
+                final UnivariateFunction f = x -> x * density(x);
                 final UnivariateIntegrator integrator = new RombergIntegrator();
                 return integrator.integrate(Integer.MAX_VALUE, f, x0, x4);
             }
@@ -161,13 +155,7 @@
             @Override
             public double getVariance() {
                 final double meanX = getMean();
-                final UnivariateFunction f = new UnivariateFunction() {
-
-                    @Override
-                    public double value(final double x) {
-                        return x * x * density(x);
-                    }
-                };
+                final UnivariateFunction f = x -> x * x * density(x);
                 final UnivariateIntegrator integrator = new RombergIntegrator();
                 final double meanX2 = integrator.integrate(Integer.MAX_VALUE,
                                                            f, x0, x4);
diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ContinuousDistributionAbstractTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ContinuousDistributionAbstractTest.java
index 59e13cb..2ccd017 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ContinuousDistributionAbstractTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ContinuousDistributionAbstractTest.java
@@ -494,12 +494,7 @@
         final double tol = 1e-9;
         final BaseAbstractUnivariateIntegrator integrator =
             new IterativeLegendreGaussIntegrator(5, 1e-12, 1e-10);
-        final UnivariateFunction d = new UnivariateFunction() {
-                @Override
-                public double value(double x) {
-                    return distribution.density(x);
-                }
-            };
+        final UnivariateFunction d = distribution::density;
         final ArrayList<Double> integrationTestPoints = new ArrayList<>();
         for (int i = 0; i < cumulativeTestPoints.length; i++) {
             if (Double.isNaN(cumulativeTestValues[i]) ||
diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TDistributionTest.java
index 2d0b457..be1635d 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TDistributionTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/TDistributionTest.java
@@ -179,7 +179,6 @@
         TestUtils.assertEquals(prob, makeNistResults(args10, 10), 1.0e-4);
         TestUtils.assertEquals(prob, makeNistResults(args30, 30), 1.0e-4);
         TestUtils.assertEquals(prob, makeNistResults(args100, 100), 1.0e-4);
-        return;
     }
 
     // See https://issues.apache.org/jira/browse/STATISTICS-25
