问题描述
我有以下清单。我想使用 lambda 和方法引用打印值。 第一个 lambda 表达式有效,但我不知道如何使用方法引用打印值,因为我收到编译错误。
List<String> letters = Arrays.asList("a","b","c");
System.out.println("Lambda upperCase forEach");
letters.forEach(l -> System.out.println(l.toupperCase))); //it works
System.out.println("Method Reference upperCase forEach");
letters.forEach(System.out::println(String::toupperCase))); //compilation error
如何使用方法引用打印值?
解决方法
使用方法引用时,不能传递参数化参数。而是尝试先将值转换为大写,然后打印如下值,
letters.stream().map(String::toUpperCase).forEach(System.out::println);
map 方法将值转换为大写,forEach 方法将打印值。
,虽然我实际上更喜欢上面 Vimukthi_R 的回答,但这里有一个替代方案。 您可以创建自己的函数,该函数接受一个字符串并调用 toUpperCase 然后 println,然后将您的函数名称作为方法引用名称:
Java 中的底线,方法引用不带参数,实际上甚至不带空参数列表。 ()
public class Example {
public static void printUpperCase(String s)
{
System.out.println(s.toUpperCase());
}
public static void main(String[] args) {
Arrays.asList("a","b","c").forEach(Example::printUpperCase);
}
}
,
letters.forEach(System.out::println(String::toUpperCase));
不编译,因为方法引用隐式接受参数,如果它们引用的方法定义了这样的参数,并且你不能显式传递它们。
即使允许显式参数,PrintStream
中的 println()
重载都不会将另一个方法引用作为参数。
letters.stream()
.map(String::toUpperCase)
.forEach(System.out::println);
会:
- 从您的
letters
中获取流对象; - 将流对象映射到它们各自的对象ს(将其视为流管道中对象的转换);
- 最后,将流的每个元素传递给方法,由
System.out::println
引用。