List myList =
Arrays.asList("a1", "a2", "b1", "c2", "c1");
myList
.stream()
.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);
因为你此时是String的一个Stream,所以可以传递String类的方法名称作为方法引用,来让Stream中的元素调用改方法,和方法是否是静态的没有关系
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
由Stream类源码,可以看出 map的参数是Function。
于是,实验一下:
Function<String, String> f3 = String::toUpperCase;
String r = f3.apply("abc");
System.out.println("r="+ r);
// 相当于:
String returnStr = "abc".toUpperCase();
System.out.println("returnStr="+ returnStr);
这样写,能编译,能正常运行。
看代码,Function<String, String>定义了两个String,第一个String,是参数“abc”,第二个参数是返回值returnStr。
所以,你的例子,是在使用“::”调用对象的非静态方法。
我的理解:“::”调用对象的Non-static方法时,第一个参数是对象本身(字符串“abc”),不是方法括号中的形式参数。
String::toUpperCase
这里不是调用,这里是传入这个函数作为参数
toUpperCase()
这才是调用