Tag: functional interface

Java8中function接口的用途

关于Java8 内置function接口,我遇到过很多问题,包括this , this , this和this 。 但所有人都在问“为什么只有一种方法?” 或“如果我使用我的function界面执行X,为什么会出现编译错误”等。 我的问题是: 当我在自己的界面中使用lambdas时,这些新function接口的存在目的是什么 ? 请考虑以下来自oracle文档的示例代码: // Approach 6: print using a predicate public static void printPersonsWithPredicate(List roster, Predicate tester) { for (Person p : roster) { if (tester.test(p)) { System.out.println(p); } } } 好的,很好,但这可以用上面的自己的例子来实现(一个单一方法的接口并不新鲜): // Approach 5: public static void printPersons( roster, CheckPerson tester) { for (Person […]

Thread.sleep的方法引用不明确

我遇到了一个奇怪的问题,其中对Thread::sleep的方法引用是不明确的,但具有相同签名的方法不是。 package test; public class Test { public static void main(String[] args) { foo(Test::sleep, 1000L); //fine foo((FooVoid)Thread::sleep, 1000L); //fine foo(Thread::sleep, 1000L); //error } public static void sleep(long millis) throws InterruptedException { Thread.sleep(millis); } public static void foo(Foo function, P param) {} public static void foo(FooVoid function, P param) {} @FunctionalInterface public interface Foo { R […]

从java8迁移到java9时,对方法的引用是不明确的

我正在将一个项目从JAVA 8迁移到JAVA 9,我在使代码工作时遇到了一些麻烦。 所有工作都在JAVA 8但在9中我遇到以下错误: Error java: reference to ok is ambiguous both method ok(java.util.function.Supplier) and method ok(web.Procedure) match 这是我调用方法时的代码: public ResponseEntity<List> mailTemplateFindAll() { return ok(() -> mailTemplateService.findAll()); } 这是实施: public ResponseEntity ok(Supplier action) { return this.body(HttpStatus.OK, action); } public ResponseEntity ok(T body) { return this.ok(() -> { return body; }); } public ResponseEntity ok(Procedure […]

为什么Java 8的ToIntFunction 不扩展Function

如果我写了ToIntFunction接口,我想在接口中编码它只是一个返回原始int的函数,如下所示: @FunctionalInterface public interface ToIntFunction extends Function { int applyAsInt(T value); @Override default Integer apply(T value) { return Integer.valueOf(applyAsInt(value)); } } 我想知道,有没有令人信服的理由让Java 8 API设计人员选择将原始备选方案与Function完全分开? 是否有一些证据表明他们认为这样做并决定反对呢? 我想类似的问题至少包括其他一些“特殊”function接口,如Consumer(可能是Function )和Supplier(Function )。 我没有深入和彻底地考虑过这个问题的所有后果,所以我可能会遗漏一些东西。 如果ToIntFunction(和其他原始通用function接口)与Function有这种关系,它将允许一个人在预期使用Function参数的位置使用它(想到的是与其他函数的组合,例如调用myFunction.compose(myIntFunction))或者当在如上所述的这种自动(非)装箱实现就足够时避免在API中编写几个专用函数。 这与这个问题非常相似: 为什么Java 8的Predicate 没有扩展Function 但我已经意识到答案可能因语义原因而不同。 因此,我正在重新设计这个问题的简单原始替代函数的问题,其中不存在任何语义,只是原始与包装类型,甚至消除了空包装对象的可能性。

function接口的行为和方法参考

当属于变量的方法的引用被破坏时会发生什么? public class Hey{ public double bar; public Hey(){ bar = 2.0d; } public double square(double num){ return Math.pow(num , bar); } } Function square; whatsGonnaHappen: { Hey hey = new Hey(); square = hey::square; }//is hey still kept around because its method is being referenced? double ans = square.apply(23d);

function界面的概念

当我瞥一眼lambda表达式时,本书涉及一个只有一个抽象方法的function界面 。 我的问题涉及该测验问题 /* Which of these interfaces are functional interfaces? */ public interface Adder{ int add(int a, int b); } public interface SmartAdder extends Adder{ int add(double a, double b); } public interface Nothing{ } 我知道最后一个不是,但我认为第一个和第二个应该是function接口。 但是这本书说第二个不是。 为什么? 它不会覆盖add方法吗? 所以即使在第二,是不是只有一种抽象方法?

Java 8 lambdas执行

我怎样才能在Java 8中做这样的事情? boolean x = ((boolean p)->{return p;}).apply(true); 现在我收到以下错误: 此表达式的目标类型必须是function接口

通过lambda表达式实现具有两个抽象方法的接口

在Java 8中引入lambda表达式以帮助减少样板代码。 如果界面只有一个方法,它可以正常工作。 如果它由多个方法组成,那么这些方法都不起作用。 我该如何处理多种方法? 我们可以选择以下示例 public interface I1() { void show1(); void show2(); } 那么主要函数的结构是什么来定义main本身的方法呢?

为什么我需要一个function界面来处理lambdas?

我认为这个问题已经存在,但我无法找到它。 我不明白,为什么有必要使用function界面来处理lambdas。 请考虑以下示例: public class Test { public static void main(String…args) { TestInterface i = () -> System.out.println(“Hans”); // i = (String a) -> System.out.println(a); i.hans(); // i.hans(“Hello”); } } public interface TestInterface { public void hans(); // public void hans(String a); } 这没有问题,但如果您取消注释注释行,它不会。 为什么? 根据我的理解,编译器应该能够区分这两种方法,因为它们具有不同的输入参数。 为什么我需要一个function界面并炸毁我的代码? 编辑:链接副本没有回答我的问题,因为我问的是不同的方法参数。 但是我在这里得到了一些非常有用的答案,感谢所有帮助过的人! 🙂 编辑2:对不起,我显然不是母语人士,但为了准确自己: public interface TestInterface { […]

Lambda只能用于function界面?

我这样做了: public class LambdaConflict { public static void main(String args[]){ //* System.out.println(LambdaConflict.get( (str) -> “Hello World!! By ME?” )); /*/ System.out.println(LambdaConflict.get(new Intf (){ @Override public String get1(String str){ return “Hello World!! By get1 ” + str; } })); /*****/ } public static String get(Intf i, boolean b){ return i.get1(“from 1”); } } interface Intf { […]