Java8-从另一个方法返回方法的实时用例是什么?

Java8-从另一个方法返回方法的实时用例是什么?,java,oop,java-8,callback,functional-programming,Java,Oop,Java 8,Callback,Functional Programming,众所周知,Java8支持函数式编程 我们可以将方法作为参数传递,并从另一个方法返回一个方法 我知道,回调是将方法作为参数传递的实时用例之一。但我找不到从另一个方法返回方法的任何实际用例。请给我一些实时的例子。在JDK本身中有很多获取/返回功能接口的例子 以下是一些显而易见的用例: “标准”逻辑: 逻辑链接(功能组合): 这里,标准的int比较器是由comparator创建的,它使用一个知道如何从集合元素类型生成int的函数 这可能是组合函数的另一种情况: Predicate isValid=s-

众所周知,Java8支持函数式编程


我们可以将方法作为参数传递,并从另一个方法返回一个方法


我知道,回调是将方法作为参数传递的实时用例之一。但我找不到从另一个方法返回方法的任何实际用例。请给我一些实时的例子。

在JDK本身中有很多获取/返回功能接口的例子

以下是一些显而易见的用例:

“标准”逻辑:

逻辑链接(功能组合):

这里,标准的
int
比较器是由
comparator
创建的,它使用一个知道如何从集合元素类型生成
int
的函数

这可能是组合函数的另一种情况:


Predicate isValid=s->s.length()您提到的“方法”称为lambdas,它们是一个强大的工具,因为它们比最初看起来的要多。乍一看,lambda只不过是用超薄语法包装的行为。但事实上,一只羔羊可以做得更多

例如,lambdas在创建时从各自的作用域中使用的“捕获”值:

...
final MyType t = someObject;
Runnable runner = () -> t.someMethod();
return runner;
...

...
runner.run();
这实际上是对对象
someObject
someMethod
的调用。这意味着,lambda实际上在创建它的位置有一个上下文,而不是调用它的位置

但还有更多:如果方法符合预期接口的特定签名,您实际上可以只传递一个方法(如您所述):

List<String> myStrings = ...;
myStrings.forEach(System.out::println);
列出myStrings=。。。;
forEach(System.out::println);
如您所见,您实际上可以链接特定于对象的方法,而不仅仅是静态方法。再一次,您已经通过了上下文

现在我们来看一个具体的问题:为什么要从方法调用返回方法lambda

Map<String, Consumer<String>> handlers = new HashMap<>();
...

public Consumer<String> getHandler(String key) {
    Consumer<String> h = handlers.get(key);
    if (h == null) {
        return System.out::println;
    }
    return h;
}
Map handlers=newhashmap();
...
公共使用者getHandler(字符串键){
consumerh=handlers.get(key);
if(h==null){
返回系统.out::println;
}
返回h;
}

现在,您可以将存储在中心位置的处理程序链接到另一个对象,并为其定义行为

从另一个方法返回一个方法?你到底在说什么?这个问题不是关于Java的。你能举一个基本的例子来说明你在Java中的意思吗?@Stultuske这个问题是关于支持函数式编程的Java8的。我相信OP指的是高阶函数()@CharalamposAnargyrou这是关于Java8的,我得到的,这是“从另一个方法返回方法”的部分,我不明白你的答案比我的答案要好得多:(
Predicate<String> isValid = s -> s.length() <= 10;
Predicate<String> isInvalid = isValid.negate();
...
final MyType t = someObject;
Runnable runner = () -> t.someMethod();
return runner;
...

...
runner.run();
List<String> myStrings = ...;
myStrings.forEach(System.out::println);
Map<String, Consumer<String>> handlers = new HashMap<>();
...

public Consumer<String> getHandler(String key) {
    Consumer<String> h = handlers.get(key);
    if (h == null) {
        return System.out::println;
    }
    return h;
}