相关疑难解决方法(0)

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

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

使用BinaryOperator功能接口编写的合并函数

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)

MergeSort编写为java.util.function.Function

public …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8

13
推荐指数
1
解决办法
4313
查看次数

Java lambda表达式如何引用自身?

我发现这篇文章在旧式函数与新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).

lambda java-8

7
推荐指数
1
解决办法
3783
查看次数

为什么递归调用此函数不会抛出NullPointerException

我的问题来自这个帖子.

考虑以下代码:

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.

希望我的问题很明确

java method-invocation java-8

2
推荐指数
1
解决办法
114
查看次数

标签 统计

java-8 ×3

java ×2

lambda ×2

method-invocation ×1