Questions tagged «method-reference»

2
Comparator.reversed()不使用lambda进行编译
我有一个包含一些User对象的列表,我正在尝试对列表进行排序,但是只能使用方法引用来工作,对于lambda表达式,编译器会给出错误: List<User> userList = Arrays.asList(u1, u2, u3); userList.sort(Comparator.comparing(u -> u.getName())); // works userList.sort(Comparator.comparing(User::getName).reversed()); // works userList.sort(Comparator.comparing(u -> u.getName()).reversed()); // Compiler error 错误: com\java8\collectionapi\CollectionTest.java:35: error: cannot find symbol userList.sort(Comparator.comparing(u -> u.getName()).reversed()); ^ symbol: method getName() location: variable u of type Object 1 error

3
方法引用缓存在Java 8中是个好主意吗?
考虑我有如下代码: class Foo { Y func(X x) {...} void doSomethingWithAFunc(Function<X,Y> f){...} void hotFunction(){ doSomethingWithAFunc(this::func); } } 假设hotFunction经常调用。那么建议缓存this::func如下: class Foo { Function<X,Y> f = this::func; ... void hotFunction(){ doSomethingWithAFunc(f); } } 据我对java方法引用的理解,使用方法引用时,虚拟机会创建一个匿名类的对象。因此,缓存引用只会创建一次该对象,而第一种方法是在每个函数调用上创建该对象。它是否正确? 应该缓存出现在代码中热门位置的方法引用,还是VM能够优化它,并使多余的缓存?是否有一般的最佳实践,还是这种高度VM实施特定于这种缓存是否有用?

2
Java 8 pass方法作为参数
当前正在学习Java 8 lambda表达式和方法参考。 我想将不带参数且没有返回值的方法作为参数传递给另一个方法。这就是我的做法: public void one() { System.out.println("one()"); } public void pass() { run(this::one); } public void run(final Function function) { function.call(); } @FunctionalInterface interface Function { void call(); } 我知道有一组预定义功能接口的java.util.function,如Function<T,R>,但我没有找到一个不带任何参数,而不是产生结果。

4
为什么在编译时不检查lambda返回类型?
使用的方法引用具有返回类型Integer。但是String在下面的示例中,允许不兼容。 如何解决方法with声明以确保方法引用类型安全而无需手动强制转换? import java.util.function.Function; public class MinimalExample { static public class Builder<T> { final Class<T> clazz; Builder(Class<T> clazz) { this.clazz = clazz; } static <T> Builder<T> of(Class<T> clazz) { return new Builder<T>(clazz); } <R> Builder<T> with(Function<T, R> getter, R returnValue) { return null; //TODO } } static public interface MyInterface …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.