Tag: 方法 引用

用于引导lambda表达式的实用程序类或方法链接的方法引用?

通过Java 8中引入的function接口,您可以轻松地将不同的表达式链接到一个新表达式中,如下面的代码片段所示。 public class PredicateChaining { public static void main(String[] args) { // verbose, but standard JDK functionality only Predicate allUpperCase = StringUtils::isAllUpperCase; Predicate longerThan5 = s -> s.length() > 5; if (allUpperCase.and(longerThan5).test(“PREDICATE”)) { System.out.println(“‘PREDICATE’ is a uppercase text, longer than 5.”); } // compact, but with utility method (‘chain’ in this case) if (chain(StringUtils::isAllLowerCase).and(s […]

Java方法引用具有generics参数的方法

我正在尝试对一个方法进行方法引用,该方法具有在类声明中指定的generics参数。 所以我有: public interface IExecutable { void execute(P parameter); } public class Parameter implements IParameter { public void childSpecific() { … } } public class TestClass { … //somewhere in the code public void foo(Parameter parameter) { parameter.childSpecific(); } public void test() { IExecutable executable = this::foo; //compilation error // The type TestClass does not […]

为什么一个方法引用ctor“抛出”……抛出?

我正在寻找一种优雅的方式来创建一个dependency injection工厂。 在我的例子中,工厂只需调用一个参数构造函数。 我找到了这个答案,概述了如何将Function用于此类目的。 但我的问题是:在我的情况下,我的ctor声明抛出一些检查exception。 我没有得到:使用对该构造函数的方法引用创建该函数不起作用。 如: import java.util.function.Function; public class Mcve { public Mcve(String s) throws Exception { // whatever } public static void main(String[] args) { Function mcveFactory = Mcve::new; } } 告诉我关于Mcve::new “Unhandled exception:java.lang.Exception”。 虽然这段代码没有调用构造函数。 两个问题: 为什么那个错误? 上面的代码没有调用ctor(还)? 有没有优雅的方法来解决这个难题? (简单地向我的main()添加throws Exception 没有帮助)

方法参考的组成

这与这个问题有关: 如何进行function组合? 我注意到方法引用可以分配给声明为Function的变量,因此我假设它应该具有andThen或compose函数,因此我希望我们可以直接组合它们。 但显然我们需要将它们分配给一个声明为Function first的变量(或者在调用之前进行类型转换),然后才能调用andThen或者在它们上进行compose 。 我怀疑我可能会对这应该如何运作有一些误解。 所以我的问题: 在我们调用andThen方法之前,为什么我们需要首先进行类型转换或将其分配给变量? 以这种方式需要完成的方法引用的类型究竟是什么? 示例代码如下。 public class MyMethods{ public static Integer triple(Integer a){return 3*a;} public static Integer quadruple(Integer a){return 4*a;} public int operate(int num, Function f){ return f.apply(num); } public static void main(String[] args){ MyMethods methods = new MyMethods(); int three = methods.operate(1, MyMethods::triple); // This is fine // […]

Java Lambda表达式

我目前正在JDK 1.8上学习lambda表达式。 我遇到了一些我发现我不明白的代码。 这是代码: import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.lang.Comparable; /** * Hello world! * */ public class App { public static void main( String[] args ) throws Exception { List list = Arrays.asList(“a”, “b”, “c”); sort(list, Comparable::compareTo); } interface MyComparable { public <T extends Comparable> int compare(T obj1, T obj2 ); } […]

有没有办法在jshell中为顶级函数使用方法引用?

假设我在jshell中这样做: jshell> void printIsEven(int i) { …> System.out.println(i % 2 == 0); …> } | created method printIsEven(int) jshell> List l = Arrays.asList(7,5,4,8,5,9); l ==> [7, 5, 4, 8, 5, 9] jshell> l.forEach(/* ??? */); // is it possible to use a method reference here? 在普通程序中,我可以在非静态上下文中编写l.forEach(this::printIsEven) ,或者在名为MyClass的类的静态上下文中l.forEach(MyClass::printIsEven) 。 在jshell中使用this::printIsEven不起作用,因为jshell在静态上下文中执行语句,但是你不能使用静态方法引用,因为没有类名称为前缀::printIsEven ,并且尝试l.forEach(::printIsEven)只是一个语法错误。

为什么在捕获静态字段值时,等效的lambda表达式和方法引用的行为会有所不同?

我对Java lambdas和方法引用行为有点困惑。 例如,我们有这个代码: import java.util.function.Consumer; public class Main { private static StringBuilder sBuilder = new StringBuilder(“1”); public static void main(String[] args) { Consumer consumer = s -> sBuilder.append(s); sBuilder = new StringBuilder(“2”); consumer.accept(“3”); System.out.println(sBuilder); } } 输出: 23 这可以按预期工作,但如果我们更换 s – > sBuilder.append(s) 同 sBuilder ::追加 输出将是: 2 你有什么想法解释这个吗? 这不是一回事吗? 谢谢。

使用本地类时无效的构造函数引用?

给出以下代码: package com.gmail.oksandum.test; import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args) { } public void foo() { class LocalFoo { LocalFoo(String in) { //Some logic } } List ls = new ArrayList(); ls.stream().map(LocalFoo::new); //Line 21 } } 我的IDE没有给我任何错误。 也就是说,直到我尝试构建项目并运行它。 当我这样做它给我一个编译器错误,如下所示: Error:(21, 24) java: incompatible types: cannot infer type-variable(s) R (argument […]

用于指定generics方法的方法引用的语法

我在“Java – 初学者指南”中阅读了以下代码 interface SomeTest { boolean test(T n, T m); } class MyClass { static boolean myGenMeth(T x, T y) { boolean result = false; // … return result; } } 以下声明有效 SomeTest mRef = MyClass :: myGenMeth; 关于上述代码的解释有两点 1 – 当generics方法被指定为方法引用时,其类型参数位于::和方法名称之前。 2 – 如果指定了generics类,则type参数在类名后面,并在::之前。 我的查询: – 上面的代码是第一个引用点的示例 有人能为我提供一个实现第二个引用点的代码示例吗? (基本上我不明白第二个引用点)。

Java构造函数引用赋值与新创建的对象赋值

我在代码中遇到了我们的项目: MyInterface var = MyClass::new; 有没有区别 MyInterface var = new MyClass(); 懒?