Method reference with a full constructor call as a lambda expression in Java

后端 未结 3 1602
臣服心动
臣服心动 2021-01-12 15:43

I have encountered a short time ago with a competitive answer better than mine that uses a quite new method reference to me as replacement of lambda.

Stream.         


        
相关标签:
3条回答
  • 2021-01-12 16:31

    It's simply the second type: a reference to a method of a specific object, there's no additional logic behind the curtain.

    0 讨论(0)
  • 2021-01-12 16:34

    You can replace

    Stream.generate(new AtomicInteger(1)::getAndIncrement)...
    

    with

    AtomicInteger containingObject = new AtomicInteger(1);
    Stream.generate(containingObject::getAndIncrement)...
    

    i.e. this method reference falls into the second category of method references - Reference to an instance method of a particular object.

    You should note that the AtomicInteger instance creation is not part of the implementation of the IntSupplier. The Java 7 equivalent would be:

    AtomicInteger aint = new AtomicInteger(1);
    IntStream.generate(new IntSupplier() {
    
        @Override
        public int getAsInt() {
            return aint.getAndIncrement();
        }
    })...
    

    .

    0 讨论(0)
  • 2021-01-12 16:45

    Well new AtomicInteger(1) returns an instance, so it's the second one. The exact details of how this is translated are implementation specific, but it's a single instance created and this is back-ed up by the JLS 15.13.3

    First, if the method reference expression begins with an ExpressionName or a Primary, this subexpression is evaluated

    In plain english, the part before :: is evaluated when it's declaration is first encountered.

    Your assumption how this is translated is almost correct, it's like generating an instance outside of the function itself and using that - since it is effectively final, this is permitted.

    0 讨论(0)
提交回复
热议问题