了解何时以及如何使用Java 8 Lambdas

我花了一些时间来学习Java 8的一些新function。 作为练习,我使用一些Java 8function接口编写了一个MergeSort。 我在下面包含完整的代码(可能存在错误/优化,如果它们与Java 8function相关,我只对它们感兴趣)。 我的问题是,我相信在使用我的function界面时有机会利用lambda表达式,但它还没有点击我的大脑。 感觉就像每次我打电话申请,我应该有一种方法可以使用“ – >”代替。 有人可以给我看灯吗?

使用BinaryOperatorfunction接口编写的合并函数

public class Merge implements BinaryOperator{ @Override public int[] apply(int[] t, int[] u) { int[] result = new int[t.length + u.length]; for (int i = 0, j = 0, k = 0; i < result.length; i++){ if( j == t.length){ result[i] = u[k++]; } else if (k == u.length) { result[i] = t[j++]; } else { result[i] = t[j] < u [k] ? t[j++] : u[k++]; } } return result; } } 

MergeSort编写为java.util.function.Function

 public class MergeSort implements Function{ Merge merge = new Merge(); @Override public int[] apply(int[] t) { if(t.length <= 1){ return t; } return merge.apply( apply(Arrays.copyOfRange(t, 0, t.length / 2)), apply(Arrays.copyOfRange(t, t.length / 2, t.length ))); } } 

主要有一个简单的测试用例

 public class MergeSortMain { public static void main(String[] args) { int values[] = {3,12,6,7,2,1,23,4,5,7,8,4,2,5,365}; MergeSort mergeSort = new MergeSort(); System.out.println(Arrays.toString(mergeSort.apply(values))); } } 

产生

 [1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 7, 8, 12, 23, 365] 

lambda表达式的概念是,您可以定义该接口类型的lambda表达式,而不是创建实现function接口的类。

例如,您的Merge类实现了BinaryOperator ,可以替换为以下lambda表达式:

 BinaryOperator merge = (t,u) -> { int[] result = new int[t.length + u.length]; for (int i = 0, j = 0, k = 0; i < result.length; i++){ if( j == t.length){ result[i] = u[k++]; } else if (k == u.length) { result[i] = t[j++]; } else { result[i] = t[j] < u [k] ? t[j++] : u[k++]; } } return result; }; 

现在我们可以类似地创建一个lambda表达式来替换MergeSort类,并且,结合两个lambdas,我们得到:

 public class MergeSortMain { public static Function mergeSort; public static void main(String[] args) { int values[] = {3,12,6,7,2,1,23,4,5,7,8,4,2,5,365}; mergeSort = l -> { BinaryOperator merge = (t,u) -> { int[] result = new int[t.length + u.length]; for (int i = 0, j = 0, k = 0; i < result.length; i++){ if( j == t.length){ result[i] = u[k++]; } else if (k == u.length) { result[i] = t[j++]; } else { result[i] = t[j] < u [k] ? t[j++] : u[k++]; } } return result; }; if(l.length <= 1){ return l; } return merge.apply( mergeSort.apply(Arrays.copyOfRange(l, 0, l.length / 2)), mergeSort.apply(Arrays.copyOfRange(l, l.length / 2, l.length ))); }; System.out.println(Arrays.toString(mergeSort.apply(values))); } } 

关于此代码的一些要点:

  1. 我不得不将mergeSort lambda的参数从t重命名为l ,因为t也用于merge lambda。
  2. 我必须将mergeSort lambda声明为静态成员(在赋值之前),因为它包含对自身的递归调用。