Java 映射与函数接口关联的管道运算符

Java 映射与函数接口关联的管道运算符,java,java-8,functional-programming,java-stream,mapping,Java,Java 8,Functional Programming,Java Stream,Mapping,我不明白为什么String::toUpperCase()表达式在流map管道中运行良好。当我在这里看这个例子时: Stream.of("test1", "test2", "test3", "test4") .filter(s -> s.contains("r")) .map(s -> s + "map") .map(String::toUpperCase)

我不明白为什么
String::toUpperCase()
表达式在流
map
管道中运行良好。当我在这里看这个例子时:

Stream.of("test1", "test2", "test3", "test4")
                .filter(s -> s.contains("r"))
                .map(s -> s + "map")
                .map(String::toUpperCase)
                .forEach(System.out::println);

当我查看下面示例
map(Function中使用的map操作符的定义时,它被称为方法引用,是lambda表达式的语法糖。换句话说:

String::toUpperCase
相当于:

s -> s.toUpperCase()

它是一种方法,它接受
字符串
s
并返回一个
字符串
,所有字母都来自
s
大写,它是一个
函数
它被称为方法引用,是lambda表达式的语法糖。换句话说:

String::toUpperCase
相当于:

s -> s.toUpperCase()

它是一种方法,它接受
字符串
s
并返回一个
字符串
,所有字母都来自
s
大写,它是一个
函数
根据
函数
接口的
应用
方法更容易理解的是方法r的匿名类表示参考
String::toUpperCase
。它是这样的-

new Function<String, String>() {
    @Override
    public String apply(String str) { // read as given a String return a String (uppercased)
        return str.toUpperCase();
    }
}
新函数(){
@凌驾
公共字符串apply(String str){//read as给定字符串返回字符串(大写)
return str.toUpperCase();
}
}

字符串参数(
str
)提供给上述
apply
方法的是在上一次
map
操作之后的
流中的
方法。

根据
函数
接口的
apply
方法,更容易理解的是方法引用
字符串::toUpperCase。事情是这样的-

new Function<String, String>() {
    @Override
    public String apply(String str) { // read as given a String return a String (uppercased)
        return str.toUpperCase();
    }
}
新函数(){
@凌驾
公共字符串apply(String str){//read as给定字符串返回字符串(大写)
return str.toUpperCase();
}
}

提供给上述
apply
方法的字符串参数(
str
)是上一次
map
操作后
流中的参数。

该方法必须与lambdas s->s.toUpperCase()的函数接口
R apply(T)
具有相同的签名这对我来说非常清楚,使用String::toUpperCase我看不到传递的参数,签名定义为空,它返回一个字符串!!!你能为我解释这一点吗?请为这个例子解释一下。forEach(System.out::println);.forEach(s->System.out.println(s));i undrestand它们是相同的,方法引用println,使用者查找void accept(T)方法;return void,println的核心定义是conforme public void println(String x),只有一个参数和returnvoid@Feres.o你完全误解了这一点。如果我有一个函数
stringf(strings,inti,double d,char c),该怎么办
并像调用
s->f(s,1,2.3,'a')
一样调用它。函数接受4个参数,但这并不重要,因为lambda只接受并返回一个参数。对我来说,它是(s,i,d,c)->{语句然后返回一个字符串}@参考o内部函数的其他参数是固定的。该方法必须具有与lambdas s->s.toUpperCase()的函数接口
R apply(T)
相同的签名这对我来说非常清楚,使用String::toUpperCase我看不到传递的参数,签名定义为空,它返回一个字符串!!!你能为我解释这一点吗?请为这个例子解释一下。forEach(System.out::println);.forEach(s->System.out.println(s));i undrestand它们是相同的,方法引用println,使用者查找void accept(T)方法;return void,println的核心定义是conforme public void println(String x),只有一个参数和returnvoid@Feres.o你完全误解了这一点。如果我有一个函数
stringf(strings,inti,double d,char c),该怎么办
并像调用
s->f(s,1,2.3,'a')
一样调用它。函数接受4个参数,但这并不重要,因为lambda只接受并返回一个参数。对我来说,它是(s,i,d,c)->{语句然后返回字符串}@Feres。o内部函数的其他参数是固定的