Tag: 方法引用

Java 8通过方法作为参数

目前正在进入Java 8的lambdaexpression式和方法引用。 我想传递一个没有参数,没有返回值的方法作为另一个方法的参数。 这是我如何做到的: 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>但是我没有find一个没有参数而没有产生结果的函数接口。

Java 8构造函数参考的可怕的性能和大堆的足迹?

我只是在我们的生产环境中有一个相当不愉快的经历,导致OutOfMemoryErrors: heapspace.. 我追溯到我的使用函数中ArrayList::new的问题。 为了validation这实际上是通过一个声明的构造函数( t -> new ArrayList<>() )执行比正常创build更差,我写了下面的小方法: public class TestMain { public static void main(String[] args) { boolean newMethod = false; Map<Integer,List<Integer>> map = new HashMap<>(); int index = 0; while(true){ if (newMethod) { map.computeIfAbsent(index, ArrayList::new).add(index); } else { map.computeIfAbsent(index, i->new ArrayList<>()).add(index); } if (index++ % 100 == 0) { System.out.println("Reached index "+index); […]

实例方法引用和Lambda参数

我无法理解方法引用的语法,其中有两个参数a和b ,引用是b上的一个方法。 例如,我明白如何 Arrays.sort(personArray, comparators::compareByName); 相当于 Arrays.sort(personArray, (o1, o2) -> comparators.compareByName(o1, o2)); 因为在这种情况下,lambda参数匹配方法调用参数(o1, o2) 。 如何为这个lambda stream.sorted((o1, o2) -> o1.compareToIgnoreCase(o2)); 我的IDE告诉我这相当于: stream.sorted(String::compareToIgnoreCase); 我没有find一个规则来replace语法: a.method(b)与方法引用。 例如,如果lambda有三个或更多的参数呢? 这是合法吗? 第一个参数是否成为方法目标,剩下的成为参数?

什么是System.out :: println的等效lambdaexpression式

我偶然发现了以下使用System.out.println的方法引用的Java代码 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); } } } System.out::println的等效lambdaexpression式是什么?

Java 8中的方法引用caching一个好主意?

考虑我有如下的代码: class Foo { Y func(X x) {…} void doSomethingWithAFunc(Function<X,Y> f){…} void hotFunction(){ doSomethingWithAFunc(this::func); } } 假设hotFunction经常被调用。 那么cachingthis::func可能是这样的: class Foo { Function<X,Y> f = this::func; … void hotFunction(){ doSomethingWithAFunc(f); } } 就我对java方法引用的理解而言,虚拟机在使用方法引用时会创build一个匿名类的对象。 因此,caching引用只会创build一个对象,而第一个方法在每个函数调用时创build该对象。 它是否正确? 是否应该caching代码中的热位置的方法引用,或者是能够优化这个并使caching变得多余的虚拟机? 有没有关于这个的一般的最佳实践,或者是这个高度虚拟机实现特定的caching是否有用?

Comparator.reversed()不使用lambda进行编译

我有一个用户对象的列表,我试图sorting列表,但只能使用方法引用,与lambdaexpression式编译器给出了一个错误: 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