Tag: 方法引用

使用方法引用

我有一个名为saveButton的JButton并希望它在单击时调用save方法。 当然,我们可以使用旧方法来做到这一点: saveButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { save(); } }); 但今天我想使用新的Java 8function,如方法引用。 为什么 saveButton.addActionListener(this::save); 不行? 如何使用方法引用完成?

java中的方法参考

我正在探索java中的方法引用,并且好奇是否可以将以下内容转换为方法引用 List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8); list.forEach(item -> new SomeClass(item).someMethod(item)); 我尝试了以下,但这不起作用 list.forEach(SomeClass::new::someMethod);

如何创建方法引用列表?

我需要处理一个列表,并为每个项目调用目标对象上的不同方法。 看起来很优雅,我可以创建一个方法引用列表来执行此操作,因此对于列表中的每个索引,我可以调用与其对应的适当方法引用。 private final static List<Consumer> METHODS = (List<Consumer>) Arrays.asList( TargetClass::setValue1, TargetClass::setValue2, TargetClass::setValue3, TargetClass::setValue4, TargetClass::setValue5); 但是,Eclipse会使用错误标记这些错误。此表达式的目标类型必须是function接口 。 现在,TargetClass这里是一个普通的类,而不是一个接口…这是否意味着没有办法完成我在这里尝试做的事情?

方法参考中的类型推断

我最近把手放在Java 8上并尝试使用方法参考。 我正在尝试不同类型的方法引用,并陷入“引用特定类型的任意对象的实例方法”类型中。 String[] arr = {“First”, “Second”, “Third”, “Fourth”}; Arrays.sort(arr, String::compareToIgnoreCase); 这非常有效。 但是当我尝试通过其类型引用用户定义类的方法时: Demo2[] arr = {a, b}; Arrays.sort(arr, Demo2::compare); 这将编译时错误显示为“无法从静态上下文引用非静态方法”。 这是Demo2类: public class Demo2 implements Comparator { Integer i; Demo2(Integer i1){ i = i1; } public Integer getI() { return i; } @Override public int compare(Demo2 o1, Demo2 o2) { return o1.getI().compareTo(o2.getI()); } […]

如何获取类(Java)中所有方法的方法引用?

方法 Java 8中特定方法的参考可以作为Class::Method获得。 但是如何获取类的所有方法的方法引用? 所有期望的方法具有不同的方法名称,但具有相同的类型签名。 此外,这些方法的名称在手头之前是未知的 。 例: class Test { public static double op0(double a) { … } public static double op1(double a) { … } public static double op2(double a) { … } public static double op3(double a) { … } public static double op4(double a) { … } } 对已知方法op0的方法引用可以获得如下: DoubleFunction f […]

具有不同arities的重载方法的方法引用无效

尝试编译表达式Comparator.comparing(String::toLowerCase) ,Java编译器返回错误。 有关更多信息,请参阅以下问题: 为什么Comparator.comparing不能与String :: toLowerCase方法引用一起使用? 我试图尽可能地减少这个问题。 特别是,我已经删除了几乎所有依赖项到其他类。 main方法包含两个方法调用。 第一个语句编译时没有错误,而第二个语句产生错误。 interface Fun { R apply(T t); } public final class Foo { public static void main(String… args) { invoke(Foo::bar); // OK invoke(Foo::baz); // ERROR } private static void invoke(Fun f) { } private String bar() { return null; } private String baz() { return null; […]

Java 8中静态方法引用的限制

我正在尝试使用方法引用来捕获方法调用,并且遇到了一些限制。 这很好用: void capture(Function in) { } private interface Foo { String getBar(); } capture(Foo::getBar); 但是,如果我将Foo.setBar的签名更改为以下内容: private interface Foo { void setBar(String bar); } capture(Foo::setBar); 我收到一个错误: Cannot make a static reference to the non-static method setBar(String) from the type MyTest.Foo 我不清楚限制是什么。 理想情况下,我想使用方法引用来捕获标准setter上的调用。 有没有办法做到这一点?

Java 8对静态方法与实例方法的引用

说我有以下代码 public class A { int x; public boolean is() {return x%2==0;} public static boolean is (A a) {return !a.is();} } 而在另一堂课…… List a = … a.stream().filter(b->b.isCool()); a.stream().filter(A::is); //would be equivalent if the static method is(A a) did not exist 问题是如何使用A :: is类型表示法引用实例方法版本? 非常感谢

通过Java 8中的方法引用调用toString

我错过了什么? 为什么我必须使用下面的Object::toString而不是Integer::toString ? 它与带有generics的类型擦除有什么关系吗? Arrays.asList(1,2,3).stream().map(Integer::toString).forEach(System.out::println); //Won’t compile Arrays.asList(1,2,3).stream().map(Object::toString).forEach(System.out::println); //Compiles and runs fine

为什么Java 8为方法引用引入了新的“::”运算符?

在Java 8中,方法引用是使用::运算符完成的。 例如 // Class that provides the functionality via it’s static method public class AddableUtil { public static int addThemUp(int i1, int i2){ return i1+i2; } } // Test class public class AddableTest { // Lambda expression using static method on a separate class IAddable addableViaMethodReference = AddableUtil::addThemUp; … } 您可以看到addableViaMethodReference现在就像AddableUtil::addThemUp的别名。 因此addableViaMethodReference()将执行与AddableUtil.addThemUp()相同的操作并返回相同的值。 他们为什么选择引入新的运营商而不是使用现有运营商呢? 我的意思是,当函数名以()结尾时执行函数,并在没有尾随()时返回函数引用。 […]