标签: method-reference

从内部匿名类访问外部匿名类的方法

我使用一个实例化另一个匿名类的方法实例化一个匿名类,并且从这个内部匿名类我想调用一个属于外部匿名类的方法.为了说明它,假设我有这个界面:

interface ReturnsANumber {
    int getIt();
}
Run Code Online (Sandbox Code Playgroud)

然后,在我的代码中的某个地方,我这样做:

    ReturnsANumber v = new ReturnsANumber() {
            int theNumber() {
                return 119;
            }

            public int getIt() {

                // In a modern version of Java, maybe I could do
                //   var a = this;
                // and then call a.theNumber();

                ReturnsANumber w = new ReturnsANumber() {
                        int theNumber() {
                            return 1;
                        }

                        public int getIt() {
                            return this.theNumber();
                        }
                    };

                return w.getIt();
            }
        };
    System.out.println("The number is " + v.getIt());
Run Code Online (Sandbox Code Playgroud)

问题: 在最里面的方法中getIt,我想调用theNumber() …

java methods anonymous-class java-8 method-reference

22
推荐指数
3
解决办法
920
查看次数

Java 8中的实例方法引用类型之间有什么区别?

所以Java 8引入了方法引用,文档描述了这四种类型.

我的问题是两种实例类型之间的区别是什么?

  1. 引用特定对象的实例方法.
  2. 引用特定类型的任意对象的实例方法.

两者都参考参考但有什么显着不同?用于解决它们的类型推断是不同的吗?重要的是(在他们的例子中)一个是闭包而另一个是lambda?它与方法的参数数量有关吗?

java java-8 method-reference

20
推荐指数
1
解决办法
2621
查看次数

System.out :: println的等效lambda表达式是什么

我偶然发现了以下使用方法参考的Java代码 System.out.println

class SomeClass{
    public static void main(String[] args) {
           List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9);
           numbers.forEach(System.out::println);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

什么是等效的lambda表达式System.out::println

java lambda java-8 method-reference

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

Java 8中实例方法引用的forEach限制

假设我有以下功能界面:

public interface TemperatureObserver {
    void react(BigDecimal t);
}
Run Code Online (Sandbox Code Playgroud)

然后在另一个类中已经填充ArrayList了类型的对象TemperatureObserver.假设temp是a BigDecimal,我可以react使用以下命令在循环中调用:

observers.forEach(item -> item.react(temp));
Run Code Online (Sandbox Code Playgroud)

我的问题:我可以使用上面代码的方法参考吗?

以下不起作用:

observers.forEach(TemperatureObserver::react);
Run Code Online (Sandbox Code Playgroud)

错误消息告诉我

  1. forEachArraylist observers该类型中不适用TemperatureObserver::react
  2. TemperatureObserver 没有定义方法 react(TemperatureObserver)

很公平,正如forEach预期的那样,作为一个参数a Consumer<? super TemperatureObserver>,我的界面尽管是功能性的,但Consumer由于react(BigDecimal在我的情况下)的不同参数而不符合.

那么这可以解决,还是一个lambda没有相应的方法参考的情况?

java foreach java-8 method-reference

20
推荐指数
3
解决办法
5392
查看次数

Foo :: new和() - > new Foo()有什么区别?

我的印象Foo::new只是语法糖() -> new Foo(),他们应该表现得相同.但似乎并非如此.这是背景:

使用Java-8,我使用第三方库,它有一个Optional<Foo> foo和这个违规行:

foo.orElseGet(JCacheTimeZoneCache::new);
Run Code Online (Sandbox Code Playgroud)

JCacheTimeZoneCache在构造函数中使用来自可选JCache库的东西,我没有在我的类路径中.使用调试器我验证了foo不是null,因此它实际上应该永远不会实例化JCacheTimeZoneCache实例,因此丢失的JCache库应该不是问题.然而,它确实爆炸,堆栈跟踪抱怨丢失的JCache库:

Caused by: java.lang.BootstrapMethodError: java.lang.IllegalAccessError: no such constructor: net.fortuna.ical4j.util.JCacheTimeZoneCache.<init>()void/newInvokeSpecial
    at net.fortuna.ical4j.model.TimeZoneLoader.cacheInit(TimeZoneLoader.java:275) ~[ical4j-3.0.0.jar:na]
    at net.fortuna.ical4j.model.TimeZoneLoader.<init>(TimeZoneLoader.java:81) ~[ical4j-3.0.0.jar:na]
    at net.fortuna.ical4j.model.TimeZoneRegistryImpl.<init>(TimeZoneRegistryImpl.java:125) ~[ical4j-3.0.0.jar:na]
    at net.fortuna.ical4j.model.TimeZoneRegistryImpl.<init>(TimeZoneRegistryImpl.java:116) ~[ical4j-3.0.0.jar:na]
    at net.fortuna.ical4j.model.DefaultTimeZoneRegistryFactory.createRegistry(DefaultTimeZoneRegistryFactory.java:48) ~[ical4j-3.0.0.jar:na]
    at net.fortuna.ical4j.data.CalendarBuilder.<init>(CalendarBuilder.java:105) ~[ical4j-3.0.0.jar:na]
    at de.malkusch.trashcollection.infrastructure.schedule.ical.VEventRepository.downloadVEvents(VEventRepository.java:46) ~[classes/:na]
    at de.malkusch.trashcollection.infrastructure.schedule.ical.VEventRepository.<init>(VEventRepository.java:35) ~[classes/:na]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_172]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_172]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_172]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_172]
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:170) ~[spring-beans-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    ... 80 common frames omitted
Caused by: java.lang.IllegalAccessError: no such constructor: net.fortuna.ical4j.util.JCacheTimeZoneCache.<init>()void/newInvokeSpecial
    at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:483) ~[na:1.8.0_172]
    ... 93 …
Run Code Online (Sandbox Code Playgroud)

java lambda method-reference

20
推荐指数
1
解决办法
536
查看次数

Java 8可以动态实现接口以供方法参考吗?

我学习了Java 8的新功能.

我正在玩不同的例子,我发现了一个奇怪的行为:

public static void main(String[] args) {       
    method(Test::new);
}
static class Test{
}

private static void method(Supplier<Test> testSupplier){
    Test test = testSupplier.get();
}
Run Code Online (Sandbox Code Playgroud)

这段代码编译成功,但我不知道它是如何工作的.

为什么可以Test::new接受供应商?

供应商界面看起来很简单:

@FunctionalInterface
public interface Supplier<T> {    
    T get();
}
Run Code Online (Sandbox Code Playgroud)

java java-8 method-reference constructor-reference

19
推荐指数
2
解决办法
2774
查看次数

为什么一个方法引用ctor"抛出"......抛出?

我正在寻找一种优雅的方式来创建一个依赖注入工厂.在我的例子中,工厂只需要调用一个参数构造函数.我发现这个答案概述了如何将a Function<ParamType, ClassToNew>用于此类目的.

但我的问题是:在我的情况下,我的ctor声明抛出一些检查异常.

我没有得到:使用对该构造函数的方法引用创建该函数不起作用.如:

import java.util.function.Function;

public class Mcve {        
    public Mcve(String s) throws Exception {
        // whatever
    }        
    public static void main(String[] args) {
        Function<String, Mcve> mcveFactory = Mcve::new;
    }
}
Run Code Online (Sandbox Code Playgroud)

告诉我"未处理的异常:java.lang.Exception" Mcve::new.虽然这段代码没有调用构造函数.

两个问题:

  • 为什么那个错误?上面的代码没有调用ctor(还)?
  • 有没有优雅的方法来解决这个难题?(只需添加throws Exception到我main()没有帮助)

java constructor method-reference

19
推荐指数
1
解决办法
1555
查看次数

Java Lambda方法引用不起作用

我的原始代码是这样的:

private static void onClicked(MouseEvent event) {
    // code to execute
}

// somewhere else in the program:
setOnMouseClicked(event -> SomeClass.onClicked(event));
Run Code Online (Sandbox Code Playgroud)

但IntelliJ说"可以用方法参考替换",我不太清楚该怎么做.我以为我会这样做:

setOnMouseClicked(event -> SomeClass::onClicked);
Run Code Online (Sandbox Code Playgroud)

但后来告诉我"虚空不是一个功能界面",但我不想返回任何东西.我只想要执行处理程序.我怎样才能解决这个问题?

谢谢!

java lambda intellij-idea java-8 method-reference

17
推荐指数
1
解决办法
8442
查看次数

如何检查两个方法引用是否引用相同的方法?

我正在尝试制作事件处理程序列表,其中handler是方法引用.要删除特定的处理程序,我需要在列表中找到它.但是我如何比较两个方法引用的代码地址?

type
  TEventHandler = reference to procedure;

procedure TestProc;
begin
end;

procedure TForm26.FormCreate(Sender: TObject);
var
  Handlers: TList<TEventHandler>;
begin
  Handlers := TList<TEventHandler>.create;
  try
    Handlers.Add(TestProc);
    Handlers.Remove(TestProc); { doesn't work }
    Assert(Handlers.Count=0);  { fails }
    Assert(Handlers.IndexOf(TestProc)>=0); { fails }
  finally
    FreeAndNil(Handlers);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

TList <>的默认比较器不能正确比较方法引用.我该如何比较它们?是否存在类似于TMethod的结构,但是方法参考?

delphi anonymous-methods method-reference

17
推荐指数
1
解决办法
521
查看次数

指定before/after :: operator的通用方法引用类型

以下方法引用之间有什么区别,

BiPredicate<List<String>,String> contains1 = List<String>::contains;

BiPredicate<List<String>,String> contains2 = List::<String>contains;

BiPredicate<List<String>,String> contains3 = List<String>::<String>contains;
Run Code Online (Sandbox Code Playgroud)

案件有特殊名称吗?有没有类似用法的例子?

java generics java-8 method-reference

17
推荐指数
2
解决办法
656
查看次数