我花了一些时间来学习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 …Run Code Online (Sandbox Code Playgroud) 我发现这篇文章在旧式函数与新Java-8 lambda函数和并行处理的比较中非常有用.我无法理解的一件事是对lambda函数的一个限制:从第4页开始:
3.3前提条件尽管lambda表达式是AIC的一种更有效的替代方法,但它们并不是完全替代的.在将AIC重构为lambda表达式之前,LambdaFicator会检查几个前提条件.这些前提条件是lambda表达式在Java中实现的固有方式,而不是我们工具的限制.(P1)AIC必须从接口实例化.抽象或具体类的实例无法转换为lambda表达式.(P2)AIC必须没有字段,并且只声明一个方法.lambda表达式代表一个匿名函数; 因此,具有多种方法的AIC无法转换为单个lambda表达式.(P3)AIC不得提及此或超级.在lambda表达式中,this和super是词法范围的,意味着它们的解释就像它们在封闭环境中一样,例如,好像它们出现在lambda表达式之前的语句中[6].但是,在AIC中,它们指的是内部类本身.(P4)AIC不得声明递归方法.为了执行递归调用,我们必须获得对匿名函数的引用.虽然LambdaFicator可以执行此重构,但这可能会在代码中引入不必要的复杂性并损害可理解性.(P4)AIC不得声明递归方法.为了执行递归调用,我们必须获得对匿名函数的引用.虽然LambdaFicator可以执行此重构,但这可能会在代码中引入不必要的复杂性并损害可理解性.(P4)AIC不得声明递归方法.为了执行递归调用,我们必须获得对匿名函数的引用.虽然LambdaFicator可以执行此重构,但这可能会在代码中引入不必要的复杂性并损害可理解性.
在P4上,"AIC不能声明递归方法...... LambdaFicator可以执行这种重构......",如何重构lambda表达式来引用自身?因为根据定义,这些lambda匿名函数没有可以引用的名称,并且没有对它们的引用(上面的P3).
我的问题来自这个帖子.
考虑以下代码:
public class Test {
static Function<Integer, Integer> fibLambda = null;
public static void main (String[] args) {
fibLambda = n -> n <= 2 ? 1 : fibLambda.apply(n - 1) + fibLambda.apply(n - 2);
System.out.println(fibLambda.apply(6));
}
}
Run Code Online (Sandbox Code Playgroud)
上面的输出是8.
我没有得到的是如何fibLamdba初始化?似乎我完全错过了方法调用是如何完成的,因为我虽然这个代码会产生一个NPE.
希望我的问题很明确