相关疑难解决方法(0)

Java 8中的::(双冒号)运算符

我正在探索Java 8源代码,发现代码的这一特定部分非常令人惊讶:

//defined in IntPipeline.java
@Override
public final OptionalInt reduce(IntBinaryOperator op) {
    return evaluate(ReduceOps.makeInt(op));
}

@Override
public final OptionalInt max() {
    return reduce(Math::max); //this is the gotcha line
}

//defined in Math.java
public static int max(int a, int b) {
    return (a >= b) ? a : b;
}
Run Code Online (Sandbox Code Playgroud)

Math::max什么样的方法指针?普通static方法如何转换为IntBinaryOperator

java java-8

912
推荐指数
8
解决办法
31万
查看次数

Java 8中使用非静态方法的lambda

我试图在新的Java 8中学习lambdas.有一件有趣的事情.如果方法与功能接口具有相同的签名,则可以使用lambdas API将其分配给它.例如.

Comparator<Integer> myComp = Integer::compare;
Run Code Online (Sandbox Code Playgroud)

这个方法(Integer.compare)是静态的,取两个值,一切都很完美.签名与接口方法中的签名相同.例如,这可以用非静态方法制作

Comparator<Integer> myComp = Integer::compareTo.
Run Code Online (Sandbox Code Playgroud)

此方法是非静态的(实例级别),此外,它只需要一个值.据我所知,Java中没有非静态方法,每个方法都是静态的,但如果它没有标记为静态,则它this作为第一个参数.如下

compareTo(this,Integer value).
Run Code Online (Sandbox Code Playgroud)

假设由于比较对象和整数而导致结果未定义是合理的.但是这个工作.

Comparator<Integer> comparator = Integer::compareTo;
Comparator<Integer> comparator2 = Integer::compare;
System.out.println(comparator.compare(1,2));
System.out.println(comparator2.compare(1,2));
Run Code Online (Sandbox Code Playgroud)

这同样有效.我调试了调用方法堆栈.在不创建实例的情况下调用比较器对象的方法比较,this.值已经由第一个参数初始化,当然这是对象的有效引用.

所以问题是这是如何工作的?在调用方法编译器检查时,如果该类只有一个字段与方法中的第一个param具有相同的类型,那么如果类具有编译器,则隐含地创建具有初始化字段的类的新实例或者它是如何工作的?

java lambda java-8

9
推荐指数
1
解决办法
3259
查看次数

使用双冒号 - 静态和非静态方法引用之间的区别

编辑:我的问题在这里得到了解答.总而言之,我对非静态方法引用的使用感到困惑.功能接口和参考方法具有不同数量的参数.

回答我的问题的是评论和接受的答案.


我目前正在阅读关于流减少方法的Java教程(https://docs.oracle.com/javase/tutorial/collections/streams/reduction.html).在那里,我发现了一段我认为错误的代码,所以我做了一个更简单的代码来确保.

// B.java file
import java.util.*;

public class B 
{
  public static void main(String[] args)
  {
    List<Integer> zahlen = new LinkedList<Integer>();
    zahlen.add(1);
    zahlen.add(2);
    zahlen.add(3);
    Averager averageCollect = zahlen.stream()
      .collect(Averager::new, Averager::addcount, Averager::combine);
    System.out.println(averageCollect.average());
  }
}

// Averager.java from the official Java tutorial
public class Averager
{
    private int total = 0;
    private int count = 0;

    public double average() {
        return count > 0 ? ((double) total)/count : 0;
    }

    public void addcount(int i) { …
Run Code Online (Sandbox Code Playgroud)

java lambda callback java-8 java-stream

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

标签 统计

java ×3

java-8 ×3

lambda ×2

callback ×1

java-stream ×1