当前位置: 首页 > 面试题库 >

多个lambda方法参考

汤跃
2023-03-14
问题内容

可以将lambda表达式中的元素完成的操作链接/连接起来,如下所示:

list.forEach(s -> {
        System.out.println(s.toLowerCase());
        System.out.println(s.toUpperCase());
});

有没有办法通过方法引用来做到这一点?像这样:

list.forEach({
    System.out::println(String::toLowerCase);
    System.out::println(String::toCase);
});

我知道我可以在四个单独的调用中执行此操作(它们也可以执行更多操作,即更改值):

list.replaceAll(String::toLowerCase);
list.forEach(System.out::println);
list.replaceAll(String::toUpperCase);
list.forEach(System.out::println);

我什至不能做这样简单的事情:

list.forEach({
    System.out::println;
    System.out::println;
});

问题答案:

通过功能接口的默认方法可以链接。但是“问题”在于,当您返回合成表达式的右侧时,推理引擎没有足够的信息来确定左侧是相同的功能接口

要提供该信息,您必须强制转换语句:

  List<String> l = Collections.emptyList();
  l.forEach(((Consumer<String>)System.out::println).andThen(System.out::println));

或先将其分配给变量:

  Consumer<String> cons = System.out::println;
  Collections.<String>emptyList().forEach(cons.andThen(System.out::println));

或者,您也可以编写可以执行所需操作的静态帮助器方法

Collections.<String>emptyList().forEach(combine(System.out::println, System.out::println));

static <T> Consumer<T> combine(Consumer<T>... consumers) {
    // exercise left to the reader
}


 类似资料:
  • 问题内容: 我对“引用特定类型的任意对象的实例方法”背后的概念感到困惑。Oracle 文档提供了有关此示例: 我为这种方法参考所见的大多数示例都是这样的:如果lambda是like,那么您可以编写like 。文档中的示例说: 方法参考String :: compareToIgnoreCase的等效lambda表达式将具有形式参数列表(字符串a,字符串b),其中a和b是用于更好地描述此示例的任意名称

  • 我对“引用特定类型的任意对象的实例方法”背后的概念感到困惑。Oracle留档有一个例子: 我看到的这种方法参考的大多数示例是这样的:如果lambda像:

  • 问题内容: 在Java中,lambda是否可以接受多种不同类型? 即:单个变量起作用: Varargs也可以工作: 但是我想要可以接受许多不同类型参数的东西,例如: 为了方便起见,主要用途是在函数内部具有小的内联函数。 我环顾了Google并检查了Java的Function Package,但找不到。这可能吗? 问题答案: 如果使用多个类型参数定义这样的功能接口,则是可能的。没有这样的内置类型。(

  • 我是kotlin的新手。我有一个带有2个重载方法的java类。一个接受一个函数,另一个接受两个 和 现在在kotlin中,我尝试使用两个参数调用版本(如java中): 但我得到编译错误。 Kotlin:意外标记(使用“;”在同一行上分隔表达式) 正确的语法是什么?

  • 问题内容: 这是我的方案: 我必须调用一个方法。假设参数为:Parameter1,Parameter2,..,..,Parameter N,但是要发送给该方法的参数在每种情况下都可能会更改。 情况1: 仅发送参数 1 情况2: 发送参数的组合 情况3: 发送所有参数 用Java实现此目标的最佳方法是什么? 问题答案: 解决方案取决于问题的答案-所有参数是否都将是同一类型,如果是,则每个参数将被视为

  • 问题内容: 从spring文档中: 如何指定使用和作为密钥? 问题答案: 如果没有另外指定,当前的Spring缓存实现将所有方法参数用作缓存键。如果要使用选定的键,请参考 Arjan的答案,该答案使用SpEL列表,这是创建唯一键的最简单方法。 从Spring文档 随着Spring 4.0的发布,默认的密钥生成策略发生了变化。Spring的早期版本使用密钥生成策略,该策略对于多个密钥参数仅考虑参数的