Den*_*ial 13 java lambda java-8
我花了一些时间来学习Java 8的一些新功能.作为练习,我使用一些Java 8功能接口编写了一个MergeSort.我在下面包含完整的代码(可能存在错误/优化,如果它们与Java 8功能相关,我只对它们感兴趣).我的问题是,我相信在使用我的功能界面时有机会利用lambda表达式,但它还没有点击我的大脑.感觉就像每次我打电话申请,我应该有一种方法可以使用" - >"代替.有人可以给我看灯吗?
public class Merge implements BinaryOperator<int[]>{
@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;
}
}
Run Code Online (Sandbox Code Playgroud)
public class MergeSort implements Function<int[], int[]>{
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 )));
}
}
Run Code Online (Sandbox Code Playgroud)
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)));
}
}
Run Code Online (Sandbox Code Playgroud)
产生
[1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 7, 8, 12, 23, 365]
Run Code Online (Sandbox Code Playgroud)
Era*_*ran 14
lambda表达式的概念是,您可以定义该接口类型的lambda表达式,而不是创建实现功能接口的类.
例如,您的Merge类实现BinaryOperator<int[]>并可以替换为以下lambda表达式:
BinaryOperator<int[]> 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;
};
Run Code Online (Sandbox Code Playgroud)
现在我们可以类似地创建一个lambda表达式来替换MergeSort类,并且,结合两个lambdas,我们得到:
public class MergeSortMain {
public static Function<int[], int[]> 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<int[]> 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)));
}
}
Run Code Online (Sandbox Code Playgroud)
关于此代码的一些要点:
mergeSort拉姆达从t到l,因为t也是在使用merge拉姆达.mergeSortlambda 声明为静态成员(在赋值之前),因为它包含对自身的递归调用.| 归档时间: |
|
| 查看次数: |
4313 次 |
| 最近记录: |